【问题标题】:ListView View Holder returning duplicate rows multiple timesListView View Holder 多次返回重复行
【发布时间】:2015-03-22 06:02:00
【问题描述】:

这是我的代码,

查看持有者类:

private class ViewHolder {
            TextView tv1;
            TextView tv2;
            TextView tv3;
            TextView tv4;
            TextView tv5;
            TextView tv6;
            TextView tv7;
            TextView tv8;
            TextView tv9;
            TextView tv10;
            TextView tv11;
            TextView tv12;
            TextView tv13;
            TextView tv14;

            EditText edit_qty;
            Button btnbonus;
            Button btnremove;
        }

ListView 自定义适配器 getView() :

@Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            ViewHolder holder = null;
            View view = convertView;
            if(view == null){
                view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
                        false);
                Typeface font = Typeface.createFromAsset(ctx.getAssets(),
                        "gothic.ttf");
                holder = new ViewHolder();
                final ProductInfo product = data.get(position);
                ctx.mProductIdList.add(product.getProductId());
                try {
                    holder.tv1 = (TextView) view
                            .findViewById(R.id.add_product_label);
                    holder.tv1.setText(product.getProductName());
                    holder.tv1.setTypeface(font);
                    holder.tv1.setVisibility(View.VISIBLE);
                    holder.tv2 = (TextView) view
                            .findViewById(R.id.Product_Code_label);
                    holder.tv2.setTypeface(font);
                    holder.tv2.setVisibility(View.VISIBLE);
                    ...............
                    ...............
                    holder.edit_qty.setVisibility(View.VISIBLE);
                    view.setTag(holder);

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }else{
                holder = (ViewHolder) view.getTag();
            }
            return view;

        }

不知道view holder的实现是否正确,ListView有n个之前填充过的重复项,不胜感激

【问题讨论】:

  • 你好,请检查更新的答案添加评论为什么你会出现这个问题..
  • 仍然出现重复行
  • 您能否发布整个适配器类,并检查您传递给适配器的数据是否正确

标签: android listview android-listview android-viewholder


【解决方案1】:

我已更新您的代码。试试这个。

 @Override
            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                ViewHolder holder = null;
                View view = convertView;
                if(view == null){
                    view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
                            false);
                    holder = new ViewHolder();
                    holder.tv1 = (TextView) view
                                .findViewById(R.id.add_product_label);
                    holder.tv2 = (TextView) view
                                .findViewById(R.id.Product_Code_label);
                    view.setTag(holder);

                }else{
                    holder = (ViewHolder) view.getTag();
                }
                Typeface font = Typeface.createFromAsset(ctx.getAssets(),
                            "gothic.ttf");

                    final ProductInfo product = data.get(position);
                    ctx.mProductIdList.add(product.getProductId());
                    try {

                        holder.tv1.setText(product.getProductName());
                        holder.tv1.setTypeface(font);
                        holder.tv1.setVisibility(View.VISIBLE);

                        holder.tv2.setTypeface(font);
                        holder.tv2.setVisibility(View.VISIBLE);
                        ...............
                        ...............
                        holder.edit_qty.setVisibility(View.VISIBLE);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                return view;

            }

【讨论】:

  • holder.tv1 = (TextView) view .findViewById(R.id.add_product_label);每次都调用它合适吗?
【解决方案2】:

从 getTag 或第一行初始化中获取持有者对象后设置值。所以它应该在 if.. else 条件检查之后 在if.. else statment 之后查看我在getview Method 中提到的评论

@Override
            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                ViewHolder holder = null;
                View view = convertView;
                if(view == null){
                    view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
                            false);

                    holder = new ViewHolder();
                try{   Typeface font = Typeface.createFromAsset(ctx.getAssets(),
                            "gothic.ttf");
                        holder.tv1 = (TextView) view
                                .findViewById(R.id.add_product_label);

                        holder.tv1.setTypeface(font);

                        holder.tv2 = (TextView) view
                                .findViewById(R.id.Product_Code_label);
                        holder.tv2.setTypeface(font);

                        view.setTag(holder);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }else{
                    holder = (ViewHolder) view.getTag();
                }


     final ProductInfo product = data.get(position);
                    ctx.mProductIdList.add(product.getProductId());
      // set data , text and visibility option after getting holder from view's getTag()
holder.tv1.setText(product.getProductName());
                        holder.tv1.setVisibility(View.VISIBLE);
                        holder.tv2.setVisibility(View.VISIBLE);
                        ...............
                        ...............
                        holder.edit_qty.setVisibility(View.VISIBLE);
                return view;

【讨论】:

  • 谢谢哥们,你的代码工作正常,但我在 listview 中有 edittext,当我输入文本时,它会在其他行中重复
  • 编辑文本问题肯定是由于一些其他代码。也许你必须展示你的整个适配器。我不知道您为什么要在适配器中使用 ctx.mProductIdList.add(product.getProductId())。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多