【问题标题】:Repeating items in ListView?在 ListView 中重复项目?
【发布时间】:2014-06-02 12:54:35
【问题描述】:

一切正常,但现在我不明白发生了什么,我有 10 个项目要显示在 listView 中,直到第 6 个项目工作正常,然后再次从第一个项目重复??

    public class GroupDetailsAdapter extends BaseAdapter {
        List<GetSetGroupDetails> group_details = new ArrayList<GetSetGroupDetails>();
        Context context;
        Typeface face;

        public GroupDetailsAdapter(List<GetSetGroupDetails> group_details,
                Context context) {
            super();
            this.group_details.clear();
            this.group_details = group_details;
            this.context = context;
            face = Typeface.createFromAsset(context.getAssets(),
                    "HelveticaNeueLTStd-Th.otf");
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            int count = group_details.size();
            return count;
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View v = convertView;
            ViewHolder holder;
            if (v == null) {
                try {

                    LayoutInflater vi = (LayoutInflater) context
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.group_item, null);
                    holder = new ViewHolder();

                    holder.tv_group_name = (TextView) v
                            .findViewById(R.id.tv_group_name);
                    String group_name = group_details.get(position).getGroup_name();
                    holder.tv_group_name.setText(group_name);
                    holder.tv_group_name.setTypeface(face);

                    holder.tv_group_reg_id = (TextView) v
                            .findViewById(R.id.tv_group_reg_id);
                    String groupRegId = group_details.get(position)
                            .getGroup_reg_id();
                    holder.tv_group_reg_id.setText(groupRegId);
                    holder.tv_group_reg_id.setTypeface(face);   

                    holder.tv_subscriber_count = (TextView) v
                            .findViewById(R.id.tv_subscriber_count);
                    holder.tv_subscriber_count.setText(group_details.get(position)
                            .getSubscriber_count());

                    v.setTag(holder);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else
                holder = (ViewHolder) v.getTag();
            return v;

        }

        class ViewHolder {
            TextView tv_group_name;
            TextView tv_group_reg_id;
            TextView tv_subscriber_count;

        }

    }

【问题讨论】:

  • 我可能错了,您实际上是在重复非空视图。尝试将 setText() 行移动到 if-else 块之后。
  • 只需调用 .clear();填充适配器之前列表中的方法
  • 是的,您只在创建视图时分配值,因此回收的视图只保留旧值

标签: android android-listview custom-adapter


【解决方案1】:

您正面临数据重复问题,只是因为您没有遵循实施 View-Holder 模式的确切标准。

错误:

在这里,如果视图为空,您正在执行 findViewById() 并设置数据,因此它将在第一组项目中运行良好,之后它将为您显示下一组项目的相同数据。

public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View v = convertView;
            ViewHolder holder;
            if (v == null) {
                try {

                    LayoutInflater vi = (LayoutInflater) context
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.group_item, null);
                    holder = new ViewHolder();

                    holder.tv_group_name = (TextView) v
                            .findViewById(R.id.tv_group_name);
                    String group_name = group_details.get(position).getGroup_name();
                    holder.tv_group_name.setText(group_name);
                    holder.tv_group_name.setTypeface(face);

                    holder.tv_group_reg_id = (TextView) v
                            .findViewById(R.id.tv_group_reg_id);
                    String groupRegId = group_details.get(position)
                            .getGroup_reg_id();
                    holder.tv_group_reg_id.setText(groupRegId);
                    holder.tv_group_reg_id.setTypeface(face);   

                    holder.tv_subscriber_count = (TextView) v
                            .findViewById(R.id.tv_subscriber_count);
                    holder.tv_subscriber_count.setText(group_details.get(position)
                            .getSubscriber_count());

                    v.setTag(holder);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else
                holder = (ViewHolder) v.getTag();
            return v;

        }

正确:

实现 View Holder 模式的正确方法是在当前视图为 null 时查找视图(第一次会发生这种情况)并仅在执行后设置数据。所以最终findViewById() 进程将第一次完成,下一次它将通过附加标签获得视图。

public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View v = convertView;
            ViewHolder holder;
            if (v == null) {
                    LayoutInflater vi = (LayoutInflater) context
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.group_item, null);

                    holder = new ViewHolder();

                    holder.tv_group_name = (TextView) v
                            .findViewById(R.id.tv_group_name);
                    holder.tv_group_reg_id = (TextView) v
                            .findViewById(R.id.tv_group_reg_id);
                    holder.tv_subscriber_count = (TextView) v
                            .findViewById(R.id.tv_subscriber_count);
                    v.setTag(holder);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else
                holder = (ViewHolder) v.getTag();

            String group_name = group_details.get(position).getGroup_name();
            holder.tv_group_name.setText(group_name);
            holder.tv_group_name.setTypeface(face);

            String groupRegId = group_details.get(position)
                            .getGroup_reg_id();
            holder.tv_group_reg_id.setText(groupRegId);
            holder.tv_group_reg_id.setTypeface(face);   

            holder.tv_subscriber_count.setText(group_details.get(position)
                            .getSubscriber_count());
            return v;

        }

【讨论】:

  • 是的,你是对的伙计。谢谢你的帮助,将来我会遵守标准,是的,Paresh 我会在几分钟内接受这个答案。谢谢你的帮助。 :)
  • 这是在滚动条上重复项目的正确解释。太好了。
  • @user1947746 谢谢,很高兴发现它有帮助!
【解决方案2】:

你可能会得到 nullpointerexception.. 摆脱这个尝试这个简单的代码

 public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder vh;
            View v = convertView;
            if(v == null){
                
                v = LayoutInflater.from(ctx).inflate(R.layout.simple_list_item, parent, false);
                vh = new ViewHolder(v);
                v.setTag(vh);
            }
            else{
                vh = (ViewHolder) v.getTag();
            }
    
            vh.tvTitle.setText(list.get(position).toString());
            return v;
        }
    
        class ViewHolder{
            TextView tvTitle;
    
            public ViewHolder(View v){
                tvTitle = (TextView) v.findViewById(R.id.tvVideoName);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多