ListView自定义适配器重复项 [英] ListView Custom Adapter repeat items

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

问题描述

此适配器有什么问题,当我向下滚动时,我在底部看到重复的行,然后再次向上滚动时,我又在顶部看到了以前不存在的重复行,而其余的Data项目不存在出现

Whats wrong with this adapter, when i scroll down i see repeated rows at the bottom and then when scroll up again i see also repeated rows at the top that were not exist before, and the rest of Data items does not appear

适配器:

public class ClassesListViewAdapter extends BaseAdapter {
    private Context mContext;
    ArrayList<String> Data = new ArrayList<>();


    public ClassesListViewAdapter(Context context, ArrayList<String> data) {
        Data = data;
        mContext = context;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getCount() {
        return Data.size();
    }
    private class ViewHolder{

        TextView ClassDataTV;

    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.classes_list_view_item, parent, false);
            holder = new ViewHolder();
            holder.ClassDataTV = (TextView) convertView.findViewById(R.id.ClassDataTV);
            holder.ClassDataTV.setText(Data.get(position));
            convertView.setTag(holder);
        }else{
            holder=(ViewHolder)convertView.getTag();
        }

        return convertView;
    }
}

以及我的使用方式:

    ArrayList<String> v = new ArrayList<>();
    v.add("AAAAAAA");
    v.add("WWWWWwW");
    v.add("VVVVVVV");
    v.add("SSSSSSSSS");
    v.add("QQQQQQQQQ");
    v.add("YYYYYYYY");
    v.add("TTTTTTT");
    v.add("UUUUUUUUUU");
    v.add("zzzzzzzzzzzz");
    v.add("CCCCCCCCCC");
    v.add("HHHHHHHHHHH");
    v.add("IIIIIIIIII");
    v.add("PPPPPPPPP");
    mListView.setAdapter(new ClassesListViewAdapter(getActivity(), v));

推荐答案

将部分代码放在if-block之外,它将被修复:

Put following part of your code outside if-block and it will be fixed :

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.classes_list_view_item, parent, false);
            holder = new ViewHolder();
            holder.ClassDataTV = (TextView) convertView.findViewById(R.id.ClassDataTV);

            convertView.setTag(holder);
        }else{
            holder=(ViewHolder)convertView.getTag();
        }

      // initialize your view here 
        holder.ClassDataTV.setText(Data.get(position));
        return convertView;
    }

ViewHolder 模式背后的逻辑表明,您应该以这种方式进行操作.当您滚动参考时,将不会再次创建一些引用并调用else block,因此这将导致您的列表未按预期更新.

The logic behind ViewHolder pattern tells that you should do it in this way. when you scroll some of reference will not created again and else block called so this cause your list not updated as you expected.

这篇关于ListView自定义适配器重复项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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