适配器的支架

时间:2013-10-28 14:36:22

标签: android gridview android-custom-view

我有一个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;

}

2 个答案:

答案 0 :(得分:0)

您可以直接使用

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

但最好使用 ViewHolder

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

答案 1 :(得分:0)

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

关于文档,here您有setTag方法的文档。 您可以看到它显示:“...标签也可用于在视图中存储数据而无需借助其他数据结构。”所以您可以回答他们使用该方法的原因,以及getTag只是为了获得你之前保存的内容。