Java RecyclerView中的多重选择?

Java RecyclerView中的多重选择?,java,android,android-recyclerview,Java,Android,Android Recyclerview,您好,我正在尝试在回收器视图中实现multi-select,以便在单击特定视图时显示图标,我已经尝试了以下代码,并且在该特定位置工作正常,但是还有其他几个视图也正在更新,因此请检查并让我知道我缺少了什么 以下是我的适配器代码: public class ContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ Context context; ArrayList<String> alCo

您好,我正在尝试在
回收器视图中实现multi-select,以便在单击特定视图时显示图标,我已经尝试了以下代码,并且在该特定位置工作正常,但是还有其他几个视图也正在更新,因此请检查并让我知道我缺少了什么

以下是我的适配器代码:

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();
    }
}
公共类ContactsAdapter扩展了RecyclerView.Adapter{
语境;
ArrayList alContactName、alContactEmail、alContactNumber;
ArrayList alFromLinkedIn;
int mergeFlag=0;
专用静态SparseBooleanArray selectedItems;
ArrayList也可选择位置;
公共联系人适配器(上下文上下文、ArrayList alContactName、ArrayList alContactEmail、ArrayList alContactNumber、ArrayList alisFromLinkedIn){
//包括一个以上用于检查类型的变量,即连接或正常接触
超级();
this.context=上下文;
this.alContactName=alContactName;
this.alContactEmail=alContactEmail;
this.alContactNumber=alContactNumber;
this.alFromLinkedIn=alisFromLinkedIn;
alSelectedPositions=新的ArrayList();
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
LayoutFlater充气机=LayoutFlater.from(上下文);
View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u merge\u contact,parent,false);
返回新联系人文件夹(视图);
}
@凌驾
public void onBindViewHolder(final RecyclerView.ViewHolder,int位置){
试一试{
((ContactsHolder)holder.relMain.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图){
也可选择职位。添加(职位);
notifyDataSetChanged();
}
});
if(alSelectedPositions.get(position)==位置){
((ContactsHolder)保持架).imgMerge.setVisibility(View.VISIBLE);
}
否则{
((ContactsHolder)holder.imgMerge.setVisibility(View.GONE);
}
}捕获(例外e){
e、 printStackTrace();
}
}

您必须做一些特定的事情:

  • 初始化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;
    }
    

    最近,我不得不实现一个multi-select
    RecyclerView
    ,下面我附加了一个简化的代码片段,以便以一种干净的方式实现
    RecyclerView
    中的multi-select功能:

    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;
        }
    }
    
    公共类ItemAdapter扩展了RecyclerView。适配器实现IMultiSelectableList{
    布尔选择模式=假;
    HashSet-selectedItems;
    柱叶螨;
    公共项适配器(ArrayList项){
    超级();
    selectedItems=newhashset();
    mItems=项目;
    }
    public void enter selectionmodewithitem(int-selectedItemPosition){
    如果(selectedItemPosition>=0&&selectedItemPosition
    ,我使用图像来显示选择,如Gmail应用程序,但可以随意使用任何适合您的内容(背景色、字体样式等)

    我为一个简单的选择交互设计了一个回调接口,
    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;
        }
    }
    
     @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();
                }
            }
    
    @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);
                }
    }