2016-04-24 61 views
12

在我的onBindViewHolder我的RecyclerView.Adapter<SearchAdapter.ViewHolder>當用戶點擊cardview一個按鈕變得可見。但是當我滾動recyclerview時,其他一些項目按鈕也顯示爲可見。這是爲什麼發生?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); 
      } 
     } 
    }); 
    ... 
} 
+0

請張貼在這裏 –

+0

你的代碼發佈@akhilRao –

回答

10

一旦開始向下滾動列表,視圖就會被回收。這意味着以前充值的ViewHolder(一些在onCreateViewHolder中創建的)被重用。
所以你需要做的是記住點擊的位置(例如通過SparseBooleanArray)並檢查onBindViewHolder該視圖是否應該可見(以前被點擊)。

您可以找到SparseBooleanArray的基本用法示例this StackOverflow

+0

由於該解決 –

2

創建例如布爾陣列的陣列,並且當每個位置點擊時,在陣列的相同位置設置爲真。並在onBindViewHolder中檢查數組[position]是否爲真,如果該項設置可見。

+0

我做以'arraylist.get(位置).type' –

6

「其他」可見項按鈕使用在回調修改的同一viewholder的人。因此,由於視圖持有者(和視圖)被回收:

  • 它們應該只存儲每次查看者綁定到某個位置時可以檢索的信息。

  • 任何可能的意見狀態被改變應在onBindViewHolder()

刷新你的情況,你應該保存「的選擇」其他地方復位onBindViewHolder()的知名度和的maxlines(不僅在回調中)

5

好主意是在回收站視圖中爲一個物品製作一個類對象,並在其中添加一個布爾型isItemWasClicked並在裏面onBindViewHolder()檢查此布爾型並使按鈕v是否可以。 例如:

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; 
     }); 
} 
... 
} 
+0

好主意感謝 –