2016-09-02 22 views
0

商品にはRecyclerViewがあります。そのためRecyclerView私はカスタムアダプタを作成しています。 1つの行を選択すると、そのビューの背景色が変更されます。問題は、RecyclerViewにアイテムがたくさんあるときに、1つの行をクリックすると、アプリケーションがそのビューの背景色を変更しますが、別の行の背景色も変更されます。RecyclerViewマルチセレクション - Android

マイアダプターコード:

public class NarackiAdapter extends RecyclerView.Adapter<NarackiAdapter.MyViewHolder> { 

    private LayoutInflater inflater; 
    private List<TableItems> items = new ArrayList<>(); 
    private List<TableItems> selected = new ArrayList<>(); 

    public NarackiAdapter(Context context, List<TableItems> items) { 
     inflater = LayoutInflater.from(context); 
     this.items = items; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.one_item, parent, false); 
     return new MyViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, int position) { 
     final TableItems item = items.get(position); 

     holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName()); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private TextView tvName; 

     public MyViewHolder(View itemView) { 
      super(itemView); 

      tvName = (TextView) itemView.findViewById(R.id.tvName); 

      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      if (getBackgroundColor(view) == R.color.primary) { 
       view.setBackgroundResoucre(R.color.light_gray); 
       selected.remove(items.get(getAdapterPosition())); 
      } else { 
       view.setBackgroundResoucre(R.color.primary); 
       selected.add(items.get(getAdapterPosition())); 
      } 
     } 
    } 
} 

答えて

0

こんにちは、あなたのonBindViewHolderで選択したかどうリサイクル業者が同じビューを再利用するためにも()のカラーacordingを変更するロジックを行う持っていて、そこにそれを更新する必要があります。スクロールするときにonBindViewHolder()がトリガされるので、現在の位置のビューが選択されているかどうかを確認する必要があります。このような

EDIT

何か:

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    final TableItems item = items.get(position); 
    //checkIfSelected(item) should check in your selected items array if this item exist there 
    if(checkIfSelected(item)){ 
     //This will be the view that you want to update background 
     view.setBackgroundResoucre(R.color.primary); 
    }else{ 
     //This will be the view that you want to update background 
     view.setBackgroundResoucre(R.color.light_gray); 
    } 
    holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName()); 
} 
+0

うーむ..私は完全に更新答えをチェック@KiKo – KiKo

+0

...あなたを理解していません – AmirG

-1

RecyclerViewは、ビューを再利用!したがって、あるビューのbackgroundColorを変更すると、RecyclerViewがそのビューを再利用すると、再利用は同じbackgroundcolorになります。 ビューが再利用されるたびに呼び出されるので、このバグの振舞いは、ホルダの変更をbindViewHolderメソッドで実装する方法です。 したがって、bindViewHolderメソッドはデータを評価し、ビューを決定する必要があります。 そして、あなたのonClick関数は、このデータを編集して呼び出す必要がありadapter.notifyItemChanged(itemPosition)またはadapter.NotifyDataChanged()

関連する問題