SparseBooleanArray prob在Vertical RecycleView中的水平Recycleview中使用

时间:2016-11-09 08:39:26

标签: android android-recyclerview recycler-adapter

我在horizontalRecycleViewverticalRecycleview。我使用SparseBooleanArray可以选择horizo​​ntatRecycleView。因此,每个用户点击水平列表中的项目我都会更改该位置的背景。

问题是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 个答案:

答案 0 :(得分:1)

RecyclerView没有为列表中的每一行创建一个视图,如果你有100行,它将创建大约7或8&#34;只是屏幕上显示的数字&#34;所以你将有大约7或8 SparseBooleanArray并且它将在所有行中重复使用它们,因此如果一行中的更改使用相同的视图参考,则会影响另一行。
您应该创建一个ArrayList<SparseBooleanArray>,其编号与VerticalAdapter中的行数相匹配,并在调用SparseBooleanArray时更新HorizontalAdapter内的onBindViewHolder()

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

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