RecyclerView的项目未正确显示

Ami*_*r_P 12 java android android-recyclerview

在我onBindViewHolderRecyclerView.Adapter<SearchAdapter.ViewHolder>用户点击cardview按钮时,我可以看到.但是当我滚动recyclerview时,其他一些项目按钮也显示为可见.为什么会这样?

这是我的代码:

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    viewHolder.card.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (viewHolder.content_layout.getVisibility() == View.VISIBLE) {
                viewHolder.content_layout.setVisibility(View.GONE);
                viewHolder.address.setMaxLines(2);
                viewHolder.attribute.setMaxLines(2);
            } else {
                viewHolder.content_layout.setVisibility(View.VISIBLE);
                viewHolder.address.setMaxLines(8);
                viewHolder.attribute.setMaxLines(8);
            }
        }
    });
    ...
}
Run Code Online (Sandbox Code Playgroud)

reV*_*rse 11

一旦开始向下滚动列表,您的视图就会被回收.这意味着onCreateViewHolder重用以前膨胀的ViewHolder(创建的一些).
所以你要做的就是记住点击的位置(例如通过SparseBooleanArray)并检查onBindViewHolder视图是否应该可见(之前点击过).

您可以SparseBooleanArray此StackOverflow帖子中找到该基本用法示例


bwt*_*bwt 6

"其他"可见项按钮是使用在回调中修改的相同视图的按钮.因为视图持有者(和视图)被回收:

  • 它们应该只存储每次将视图符号绑定到某个位置时可以检索的信息.

  • 应该刷新视图状态中可能更改的任何内容 onBindViewHolder()

在你的情况下,你应该在其他地方存储'被选中' 重置可见性和最大线onBindViewHolder()(不仅在回调中)


Wac*_*oon 5

好主意是在Recycler视图中为一个项目创建一个包含所需数据的类对象,同时添加一个布尔值isItemWasClicked并在内部onBindViewHolder()检查此布尔值并使按钮可见或不可见.例如:

public class OneItemOfList{
    int priceToDisplay;
    String name;
    String date;
    boolean wasClicked;
}

public class YourAdapter extends RecyclerView.Adapter<OneItemOfList.ViewHolder> {
ArrayList<OneItemOfList> items;
...
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
    viewHolder.view.setText(items.get(position).name);
    if (items.get(position).wasClicked)
        viewHolder.button.setVisible(View.VISIBLE);
    else
        viewHolder.button.setVisible(View.GONE);
    viewHolder.view2.setOnClickListener(...
        OnClick(...){
            items.get(position).wasClicked = !items.get(position).wasClicked;
        });
}
...
}
Run Code Online (Sandbox Code Playgroud)