【问题标题】:ListView Custom Adapter repeat itemsListView 自定义适配器重复项
【发布时间】:2016-05-04 20:49:34
【问题描述】:

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

适配器:

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));

【问题讨论】:

  • 您是否更改了适配器中的可见性?
  • 同样的事情发生在我身上,但我的项目会定期重复,如:A、B、C、D、A、B、C、D 等等。我用我在 StackOverflow 上找到的解决方案修复了它。
  • @Vucko,链接失效
  • @Amir,不,但我打电话给setAdapter onResume,这会是个问题吗?
  • @Amir,好的,我会考虑您的建议-感谢您的帮助

标签: android listview custom-adapter


【解决方案1】:

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

  @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,因此这会导致您的列表未按预期更新。

【讨论】:

  • 虽然这是真的,但您也应该解释原因。
  • 是的,效果很好
  • This 与您的问题有关,the selected answer 可能会有所不同。
  • @ishmaelMakitla,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2014-05-20
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多