2016-11-09 72 views
1

我有horizontalRecycleViewverticalRecycleview。我使用SparseBooleanArray可以选择horizo​​ntatRecycleView。因此,每个用户点击水平列表中的项目,我都会更改该位置的背景。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计数和更新ArrayList<SparseBooleanArray>SparseBooleanArrayHorizontalAdapteronBindViewHolder()被称为

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

和水平适配器添加更新SparseBooleanArray数据的方法updateSparseArray()

+0

真棒。感谢您分享您的知识。 –