2016-04-24 11 views
12

私のonBindViewHolderが私のRecyclerView.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); 
      } 
     } 
    }); 
    ... 
} 
+0

ここ –

+0

をあなたのコードを投稿してください私は 'arraylist.get(位置)で –

答えて

10

リストのスクロールを開始すると、ビューはリサイクルされます。これは、以前に拡張されたViewHolder(onCreateViewHolderで作成されたもの)が再利用されたことを意味します。
クリックした位置を覚えておいて(SparseBooleanArrayなど)、onBindViewHolderに表示するかどうか(以前にクリックしたかどうか)を確認する必要があります。

あなたが「その他」の項目表示ボタンがコールバックに変更されたのと同じviewholderを使用したものですthis StackOverflowポスト

+0

感謝を.type'ことをやってる@akhilRao –

2

は、たとえばブール配列、及び各位置は、クリックされた配列の同じ位置に真に設定のための配列を作成します。 onBindViewHolderでその配列[position]がtrueであるかどうかを確認して、その項目を表示可能に設定します。

+0

を掲載しました –

6

SparseBooleanArrayの基本的な使用例を見つけることができます。だから、ためviewholders(およびビュー)がリサイクルされています

  • 彼らは唯一viewholderが位置にバインドされるたびに取得することができる情報を格納する必要があります。ビューステートを変更してもよい

  • ものは、あなたが保存する必要がありますあなたのケースではonBindViewHolder()

でリフレッシュされなければならないどこか別の場所onBindViewHolder()での視認性とMAXLINESをリセット「を選択します」

5

リサイクラビューの1つのアイテムに必要なすべてのデータを持つクラスオブジェクトを作成することもお勧めします。ブール値isItemWasClickedを1つ追加し、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

良いアイデアのおかげで解決し –

関連する問題