Android RecyclerView,回收无法正常工作

时间:2015-03-29 02:09:51

标签: java android android-recyclerview

我正在使用RecyclerView。我之前使用过RecyclerView但从未遇到过这个问题。

当我向上和向下滚动时,一些项目消失,一些消失的项目再次出现在底部。

代码:

ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView txt;

    public ViewHolder(View view) {
        super(view);
        txt = (TextView) view.findViewById(R.id.txt);
    }
}

Adapter

public class MyAdapter extends RecyclerView.Adapter<ViewHolder> {
    private final Activity activity;
    private final ArrayList<HashMap<String, String>> mItems;

    public MyAdapter (Activity activity, ArrayList<HashMap<String, String>> mItems) {
        this.activity = activity;
        this.mItems= mItems;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.items, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        HashMap<String, String> item = mItems.get(position);

        String info = item.get("info ");
        if (info!= null) {
            viewHolder.txt.setText(info);
        } else {
            viewHolder.txt.setVisibility(View.GONE);
        }
    }

    @Override
    public int getItemCount() {
        return (null != mItems? mItems.size() : 0);
    }
}

1 个答案:

答案 0 :(得分:8)

onBindViewHolder重新使用视图,因此我们假设第一次调用onBindViewHolder()infonull。这将导致该行具有View.GONE的可见性。

再次调用onBindViewHolder绑定新行时,该行的视图仍为View.GONE - 在绑定的行之间不会重置任何内容。

因此,您的if语句应该完全重置状态:

if (info!= null) {
    viewHolder.txt.setText(info);
    viewHolder.txt.setVisibility(View.VISIBLE);
} else {
    viewHolder.txt.setVisibility(View.GONE);
}

这将确保正确设置每一行的可见性。