关于 java:RecyclerView 的项目没有正确显示

Items of RecyclerView are not showing correctly

在我的 RecyclerView.Adapter<SearchAdapter.ViewHolder>onBindViewHolder 中,当用户单击 cardview 时,一个按钮变得可见。但是当我滚动 recyclerview 时,其他一些项目按钮也显示为可见。为什么会这样?

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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);
            }
        }
    });
    ...
}


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

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


\\'其他\\'可见项目按钮是使用在回调中修改的相同视图的按钮。所以因为视图持有者(和视图)被回收了:

  • 它们应该只存储每次viewholder绑定到一个位置时可以检索到的信息。

  • 视图状态中可能发生的任何更改都应在 onBindViewHolder()

    中刷新

在您的情况下,您应该将 \\'is selected\\' 存储在其他地方并重置 onBindViewHolder() 中的可见性和 maxlines(不仅在回调中)


好主意是在回收站视图中创建一个包含一个项目所需的所有数据的类对象,还在那里添加一个布尔值 isItemWasClicked 并在 onBindViewHolder() 内检查这个布尔值并使按钮可见或不可见。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
        });
}
...
}

创建一个数组,例如布尔数组,并在每个位置单击时,在数组的相同位置设置为true。并在 onBindViewHolder 检查该 array[position] 是否为 true 设置该项目是否可见 if.