2016-11-09 10 views
1

内にはverticalRecycleviewがあります。 SparseBooleanArrayを使用してhorizo​​ntalViewRecycleViewを選択可能にしました。だから、すべてのユーザーが横のリストから項目をクリックすると、その位置の背景が変わります。SparseBooleanArrayは垂直リサイクルビュー内の水平リサイクルビューで使用されます

問題は、ビュー/行ごとに初期化されたSparseBooleanArrayは、私が推測するのと同じ物理アドレスを使用しています。選択したすべてのポジションはすべての水平リストに反映されます。ここ

は私のコードです:

RecycleView-垂直

public class ChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case 3: 
     return new HorizontalListHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_adapter_recycleview_horizontal, parent, false)); 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    switch (type) { 
     int type = chatAdapterModels.get(position).getVIEWTYPE(); 

     case HORIZONTAL_LIST: 
     HorizontalListHolder viewHolder = (HorizontalListHolder) holder;            
     viewHolder.chatHorizontalAdapter.updateData(chatAdapterModels.get(position).getChatHorizontalModels()); 
     break; 
    } 
    } 

    public final class HorizontalListHolder extends RecyclerView.ViewHolder { 
    ChatHorizontalAdapter chatHorizontalAdapter = null; 
    private SparseBooleanArray sparseBooleanArray; 

    @BindView(R.id.recycle_view) 
    RecyclerView recyclerView; 

    public HorizontalListHolder(View itemView) { 
     super(itemView); 
     ButterKnife.bind(this, itemView); 
     sparseBooleanArray = new SparseBooleanArray(); 

     chatHorizontalAdapter = new ChatHorizontalAdapter(context, sparseBooleanArray); 
     chatHorizontalAdapter.onItemClickListener(this); 
     recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); 
     recyclerView.setAdapter(chatHorizontalAdapter); 
    } 
    } 
} 

水平-RecycleView

public class ChatHorizontalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context context; 
    private ChatHorizontalAdapter.ClickListner clickListner; 
    ArrayList<ChatHorizontalModel> horizontalModels; 
    private SparseBooleanArray sparseBooleanArray; 

    private int lastPosition; 

    public ChatHorizontalAdapter(Context activity, SparseBooleanArray sparseBooleanArray) { 

    context=activity; 
    this.sparseBooleanArray=sparseBooleanArray; 
    } 

    public void updateData(ArrayList<ChatHorizontalModel> horizontalModels,int viewType){ 
    this.horizontalModels=horizontalModels; 
    notifyDataSetChanged(); 
    // sparseBooleanArray.clear(); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType){ 
     case 1: return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_recycle_adapter_view, parent, false)); 
     // case 2: return new something 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ViewHolder viewHolder = (ViewHolder) holder; 
     String strings=horizontalModels.get(position).getStr(); 
     viewHolder.textView.setText(strings); 
     viewHolder.imageView.setImageResource(horizontalModels.get(position).getImages()); 
     changeBackgroundColor(sparseBooleanArray.get(position),viewHolder.cardView,viewHolder.imageView,viewHolder.textView,horizontalModels.get(position).getImages()); 

    } 

    @Override 
    public int getItemViewType(int position) { 
     return viewType; 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     @BindView(R.id.mainCardView)CardView cardView; 
     @BindView(R.id.image)ImageView imageView; 
     @BindView(R.id.textView)TextView textView; 
     public ViewHolder(View itemView) { 
     super(itemView); 
     ButterKnife.bind(this,itemView); 
     cardView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
     if(clickListner!=null){ 
      clickListner.onItemClick(getAdapterPosition()); 

      handleSelection(getAdapterPosition()); 
      notifyDataSetChanged(); 
     } 
     } 
    } 

    public interface ClickListner { 
     void onItemClick(int position); 
    } 

    public void onItemClickListener(ChatHorizontalAdapter.ClickListner clickListner){ 
     this.clickListner=clickListner; 
    } 

    public void handleSelection(int position){ 
     sparseBooleanArray.clear(); 
     for (int i = 0; i <=horizontalModels.size() ; i++) { 
     if (i==position) { 
      sparseBooleanArray.put(i, true); 
     } else { 
      sparseBooleanArray.put(i,false); 
     } 
     } 
    } 

    public void changeBackgroundColor(boolean set, View cardView, ImageView imageView, TextView textView, int images){ 
     // change bck color of selected item 
    } 
} 

答えて

1

RecyclerViewはあなたの各行にビューを作成しません。あなたが100の行を持っているならば、それはおそらく約7または8 "を作成しますあなたの画面に表示されている数字」をクリックすると、約7または8の数字が表示され、SparseBooleanArrayがすべての行で再利用されるため、同じ行の参照が使用されている場合、
あなたの行がVerticalAdapterでカウントし、onBindViewHolder()

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    HorizontalListHolder viewHolder = (HorizontalListHolder) holder; 
    // Where mSparseList is ArrayList<SparseBooleanArray> 
    viewHolder.updateSparseArray(mSparseList.get(position)); 
} 

と水平アダプタで呼び出されたときHorizontalAdapter内部SparseBooleanArrayを更新一致する番号とArrayList<SparseBooleanArray>を作成する必要がSparseBooleanArrayデータを更新する方法updateSparseArray()を追加します。

+0

素晴らしいです。あなたの知識を共有してくれてありがとう。 –

関連する問題