在 ListView 中重复项目? [英] Repeating items in ListView?

查看:21
本文介绍了在 ListView 中重复项目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Everything was working fine but now I am not getting what is happening,I have 10 items to display in the listView,its working fine till the 6th item and after that it repeats again from the 1st item again??

    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;

        }

    }

推荐答案

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

You are facing that data repeat issue, just because you aren't following the exact standards of implementing View-Holder pattern.

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

Here you are doing findViewById() and setting data if view is null, so it will be running fine for first set of items, afterword it will show you the same data for the next sets of items.

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;

        }

正确:

实现视图持有者模式的正确方法是,如果当前视图为空(这将是第一次发生),则查找视图并仅在执行后才设置数据.所以最终 findViewById() 过程将在第一次完成,下次它将通过使用附加标签获取视图.

Correct:

Correct way to implement View Holder pattern is to find views if current view is null (that would happen for the first time) and set data only after doing it. So eventually findViewById() process will be done for the first time and next time onwards it will get views by using attached tags.

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;

        }

这篇关于在 ListView 中重复项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆