0

我有一个 gridView,我在其中使用自定义适配器填充数据。为此,我重写了 getView() 方法。但是,由于我的 gridView 是自定义的,我不得不使用静态持有者类(如在线提供的许多示例中所见)。如果我不想使用持有人,我还能以什么其他方式实现它?为什么要使用 getTag() 和 setTag() ?我搜索了它们,但找不到足够的解释。

持有人类 -

static class RecordHolder{
    ImageView imgView;
    TextView txtView;
}

getView 方法 -

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    RecordHolder holder = new RecordHolder();
    if (convertView == null) {
        LayoutInflater inflater = (getActivity()).getLayoutInflater();
        row = inflater.inflate(R.layout.grid_line, parent, false);

        holder.imgView = (ImageView) row.findViewById(R.id.imageView);
        holder.txtView = (TextView) row.findViewById(R.id.textView);

        row.setTag(holder);
    } else {
        holder = (RecordHolder) row.getTag();
    }

    ResolveInfo resolveInfo = mAppList.get(position);
    holder.imgView.setImageDrawable(resolveInfo.loadIcon(getActivity().getPackageManager()));
    holder.txtView.setText(resolveInfo.loadLabel(getActivity().getPackageManager()));

    return row;

}
4

2 回答 2

0

你可以直接使用

final ImageView imgView = (ImageView) row.findViewById(R.id.imageView);
final TextView txtView = (TextView) row.findViewById(R.id.textView);

但最好使用ViewHolder

ViewHolder 对象将每个组件视图存储在 Layout 的 tag 字段中,因此您可以立即访问它们而无需重复查找它们。首先,您需要创建一个类来保存您的确切视图集。

于 2013-10-28T14:42:39.403 回答
0

正如 Gupta 所说,您可以在每次需要填充行或网格时执行 findviewbyid,但这只是效率低下,因此最好只执行一次,然后将指针存储到行内的每个视图或网格(存储在表示行的视图中),这将在每次需要为行充气时节省您的时间,因此您会看到性能的提高。

关于文档,这里有 setTag 方法的文档。您可以看到它说:“......标签也可以用于在视图中存储数据,而无需求助于其他数据结构。” 因此,您可以回答为什么他们使用该方法,而 getTag 只是为了获取您之前保存的内容。

于 2013-10-28T14:48:52.797 回答