Android ListView使用ViewHolder的替代方法

Android ListView使用ViewHolder的替代方法,android,android-listview,Android,Android Listview,我已经创建了一个ListView及其自定义适配器。但由于某些原因,我不允许从视图持有者获取项目 在我的例子中,ViewHolder只有一个变量,即LinearLayout线性布局包含其他子视图(在运行时确定和创建)。当我使用ViewHolder并设置holder对象的标记时,在scroll上我再次获得相同的视图 有没有其他方法可以停止适配器在滚动时创建视图 或者,在滚动时,如何清除视图的引用 我已经找到了这个,但我认为这不管用 setRecyclerListener(new Recycl

我已经创建了一个
ListView
及其自定义适配器。但由于某些原因,我不允许从
视图持有者
获取项目

在我的例子中,
ViewHolder
只有一个变量,即
LinearLayout
<代码>线性布局包含其他子视图(在运行时确定和创建)。当我使用ViewHolder并设置holder对象的标记时,在scroll上我再次获得相同的视图

  • 有没有其他方法可以停止适配器在滚动时创建视图
  • 或者,在滚动时,如何清除视图的引用
  • 我已经找到了这个,但我认为这不管用

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

    ViewHolder
    是指包含listitem布局ID的holder。 这是一种优化,避免每次通过数据容器(如arrayList)创建新的listitem进行显示时调用
    findViewById

    不能在创建项目视图之间停止适配器。 仅创建显示的项目。 convertView充当循环对象,用于在上/下滚动时创建后续视图。 您将无法使用view holder实现您试图实现的目的。 示例用法如下所示

        @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;             
        }
    

    ViewHolder的作用是包含对布局子视图的引用,而不是布局本身。@FrankN.Stein是的,您是对的。但是我在单元格中添加了一个视图(线性布局)。请删除无用的视图固定器模式,并在
    getView
    方法中使用
    convertView
    参数是的,但我需要的是停止每次在不使用ViewHolder的情况下重新创建视图。@AkhileshMani然后像上面一样使用
    convertView
    answer@pskink我不明白如何使用convertview。@AkhileshMani
    if(convertview==null){…
    还可以阅读
    getView(int位置,视图convertview,视图组父级)
    documentation@pskink在我的情况下,这将不起作用,因为我没有任何视图的Id。布局包含子视图(在运行时决定和创建的子视图),此单个布局充当列表单元格。