ListView使用ViewHolder替代

时间:2015-11-05 09:08:34

标签: android android-listview

我创建了一个ListView及其自定义适配器。但由于某种原因,我不允许从ViewHolder获取物品。

在我的情况下,ViewHolder只有一个变量且LinearLayoutLinearLayout包含其他子视图(在运行时决定并创建)。当我使用ViewHolder并设置holder对象的标签时,在滚动时我会再次获得相同的视图。

  1. 还有其他方法可以在滚动时停止适配器创建视图吗?
  2. 或者,在滚动的同时我们如何清除视图的引用?
  3. 我找到了这个,但我认为这不会起作用。

        setRecyclerListener(new RecyclerListener() {
            @Override
            public void onMovedToScrapHeap(View view) {
               //from here can we use this to clean the memory
            }
        });
    

1 个答案:

答案 0 :(得分:0)

ViewHolder是指包含listitem布局ID的持有者。 每次通过遍历数据容器创建新的列表项目以进行显示时,优化避免调用findViewById。数组列表。

您无法在创建项目视图之间停止适配器。 仅显示显示的项目。 convertView充当被回收的对象,用于在向上/向下滚动时创建后续视图。 您将无法使用视图持有者达到您想要达到的目的。 示例用法如下。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = convertView;
        ViewHolder viewHolder = null;
        if(convertView == null)
        {
            v = LayoutInflater.from(StockDetailsActivity.this).inflate(R.layout.stock_details_list_item, null);

            viewHolder = new ViewHolder();
            viewHolder.model_name_tv = (TextView) v.findViewById(R.id.model_name);
            viewHolder.model_type_iv = (ImageView) v.findViewById(R.id.model_type_icon);
            viewHolder.model_type_tv = (TextView) v.findViewById(R.id.model_type_desc);
            viewHolder.model_stock_tv = (TextView) v.findViewById(R.id.model_stock_value);
            v.setTag(viewHolder);
        }
        else
            viewHolder = (ViewHolder) v.getTag();

        stockCursor.moveToPosition(position);

        // logic to update data to views as appropriate goes here

        return v;
    }

    public class ViewHolder{
        public TextView model_name_tv;
        public ImageView model_type_iv;                 
        public TextView model_type_tv;              
        public TextView model_stock_tv;             
    }