RecyclerView中的多选?

时间:2018-04-24 06:57:24

标签: java android android-recyclerview recycler-adapter

您好我正在尝试在recycler view android中实现多选,以便在点击该特定视图时显示图标,我已经尝试了以下代码并且对于该特定位置工作正常,但是还有其他几个视图这也正在更新,所以请检查并让我知道我错过了什么

这是我的适配器代码:

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

Context context;
ArrayList<String> alContactName, alContactEmail, alContactNumber;
ArrayList<Boolean> alFromLinkedIn;
int mergeFlag=0;
private static SparseBooleanArray selectedItems;
ArrayList<Integer> alSelectedPositions;

public ContactsAdapter(Context context, ArrayList<String> alContactName, ArrayList<String> alContactEmail, ArrayList<String> alContactNumber, ArrayList<Boolean> alisFromLinkedIn) {
    //Include one more variable for checking type i.e linked in or normal contact
    super();
    this.context = context;
    this.alContactName = alContactName;
    this.alContactEmail = alContactEmail;
    this.alContactNumber = alContactNumber;
    this.alFromLinkedIn = alisFromLinkedIn;
    alSelectedPositions=new ArrayList<>();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_merge_contact, parent, false);
    return new ContactsHolder(view);
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    try {
        ((ContactsHolder) holder).relMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alSelectedPositions.add(position);
                notifyDataSetChanged();
            }
        });
      if(alSelectedPositions.get(position)==position){
            ((ContactsHolder) holder).imgMerge.setVisibility(View.VISIBLE);
        }
        else {
            ((ContactsHolder) holder).imgMerge.setVisibility(View.GONE);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

4 个答案:

答案 0 :(得分:0)

你要做一些具体的事情:

  • 初始化一个int类型数组(类型可以不同)并为其所有元素赋值0。

    int[] selectedPos = null;
    public ContactsAdapter(Context context, ArrayList<String> alContactName, ArrayList<String> alContactEmail, ArrayList<String> alContactNumber, ArrayList<Boolean> alisFromLinkedIn) {
        //Include one more variable for checking type i.e linked in or normal contact
        super();
        this.context = context;
        this.alContactName = alContactName;
        this.alContactEmail = alContactEmail;
        this.alContactNumber = alContactNumber;
        this.alFromLinkedIn = alisFromLinkedIn;
        alSelectedPositions=new ArrayList<>();
    
        for(int i = 0 ; i < alContactName.size() ; i++)
            selectedPos[i] = 0;
    }
    
  • 将所选位置存储在selectedPos

  • 然后,检查位置是否被选中并相应地设置可见性:

onBindViewHolder()中添加以下代码:

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    try {
        ((ContactsHolder) holder).relMain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            selectedPos[position] = 1;
            notifyDataSetChanged();
        }
    });

    } catch (Exception e) {
        e.printStackTrace();
    }

    // Checking if the position was selected
    if(selectedPos[position] == 1)
        ((ContactsHolder) holder).imgMerge.setVisibility(View.VISIBLE);
    else
        ((ContactsHolder) holder).imgMerge.setVisibility(View.GONE);

}

答案 1 :(得分:0)

最近我必须实现一个多选RecyclerView,下面我添加了一个简化的代码段,以便在RecyclerView中实现多选功能的简洁方法:

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemHolder> implements IMultiSelectableList<Item> {

    boolean selectionMode = false;
    HashSet<Item> selectedItems;
    ArrayList<Item> mItems;

    public ItemAdapter(ArrayList<Item> Items) {
        super();

        selectedItems = new HashSet<>();
        mItems = Items;
    }

    public void enterSelectionModeWithItem(int selectedItemPosition){
        if(selectedItemPosition >= 0 && selectedItemPosition < mItems.size())
            selectedItems.add(mItems.get(selectedItemPosition));

        selectionMode = true;
        notifyDataSetChanged();
    }

    public void clearSelectionMode() {
        selectionMode = false;
        selectedItems.clear();
        notifyDataSetChanged();
    }

    public class ItemHolder extends RecyclerView.ViewHolder{

        ImageView mImage;

        public ItemHolder(View itemView) {
            super(itemView);
            mImage = itemView.findViewById(R.id.image);

            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    if(!selectionMode){
                        int selectedPosition = getAdapterPosition();
                        Item selectedItem = mItems.get(selectedPosition);
                        enterSelectionModeWithItem(selectedItem);
                        return true;
                    }
                    return false;
                }
            });

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int selectedPosition = getAdapterPosition();
                    Item selectedItem = mItems.get(selectedPosition);

                    //Capture Clicks in Selection Mode
                    if(selectionMode){
                        if(selectedItems.contains(selectedItem)){
                            selectedItems.remove(selectedItem);
                            mImage.setImageResource(R.drawable.ic_checkbox_blank_circle_outline_grey600_48dp);
                        } else {
                            selectedItems.add(selectedItem);
                            mImage.setImageResource(R.drawable.ic_checkbox_marked_circle_grey600_48dp);
                        }
                    }
                }
            });
        }

        public void setupView(Item item){
            if(selectionMode){
                if(selectedItems.contains(item)){
                    mImage.setImageResource(R.drawable.ic_checkbox_marked_circle_grey600_48dp);
                } else {
                    mImage.setImageResource(R.drawable.ic_checkbox_blank_circle_outline_grey600_48dp);
                }
        }
    }

    @Override
    public ItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_item, parent, false);
        return new ItemHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemAdapter.ItemHolder holder, int position) {
        holder.setupView(mItems.get(position));
    }

    @Override
    public int getItemCount() {
        return mItems != null ? mItems.size() : 0;
    }
}

,我使用图片显示 Gmail 应用程序等选项,但您可以随意使用适用于您的任何内容(背景颜色,字体样式等)。

P.S:我为简单的选择交互设计了一个回调接口,如果有帮助我也可以附加它!干杯!

答案 2 :(得分:0)

检查更新的代码。我修改了@tahsinRupam代码。

 @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
            try {
                ((ContactsHolder) holder).relMain.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if(alSelectedPositions.size>0)
                         {
                          for(int i=0;i<a1SelectedPositions.size;i++)
                          {
                           //if you want to cleasr previous details of array
                           if(a1SelectedPositions.contains(position))
                             alSelectedPositions.remove(position);
                           else
                            alSelectedPositions.add(position);
                         }
                       }
               else
               {
                 alSelectedPositions.add(position);
                  notifyDataSetChanged();
                    }
                });

//update the position on scroll     
              for(int i=0;i<a1SelectedPositions.size;i++)
               {
                 if(alSelectedPositions.get(i)==position){
                  ((ContactsHolder)holder).imgMerge.setVisibility(View.VISIBLE);
                }
                else {
                    ((ContactsHolder) holder).imgMerge.setVisibility(View.GONE);
                }
          }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

答案 3 :(得分:0)

我已经解决了我的问题,这是代码,如果它可以帮助某人:

@Override
    public ContactsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_merge_contact, parent, false);
        final ContactsHolder holder = new ContactsHolder(view);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.getAdapterPosition() != RecyclerView.NO_POSITION) {
                    mSelectedItemPosition = holder.getAdapterPosition();
                    //notifyItemChanged(holder.getAdapterPosition());
                    notifyDataSetChanged();
                }
            }
        });
        return holder;
    }

@Override
    public void onBindViewHolder(ContactsHolder holder, int position) {
        try {
            if (mSelectedItemPosition == position) {
                if (mergeFlag != 1) {
                    holder.imgMerge.setVisibility(View.VISIBLE);
                    mergeFlag = 1;
                    selectdParentId = contactsModels.get(position).alContactIdList;
                } else{
                    //holder.relDone.setVisibility(View.GONE);
                    if (!selectdParentId.equals(contactsModels.get(position).alContactIdList)) {
                        holder.relDone.setVisibility(View.VISIBLE);
                        alChildId.add(contactsModels.get(position).alContactIdList);

                    } else {
                        holder.imgMerge.setVisibility(View.VISIBLE);
                    }
                }
            } else {
                holder.imgMerge.setVisibility(View.GONE);
                holder.relDone.setVisibility(View.GONE);
            }
}