Saltar al contenido

¿Cómo implementar la selección múltiple en RecyclerView?

Hola, tenemos la solución a tu búsqueda, desplázate y la obtendrás un poco más abajo.

Solución:

Sé que es un poco tarde para responder a esta pregunta. Y no sé si cumple con los requisitos de OP o no. Pero esto puede ayudar a alguien. Implementé este RectyclerView de selección múltiple con un simple truco. Aquí está mi código.

activity_main.xml




   


item_row.xml




   


En item_row.xmlandroid:clickable="true" es importante.

MainActivity.java

public class MainActivity extends AppCompatActivity 

    private List mModelList;
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mAdapter = new RecyclerViewAdapter(getListData());
        LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);
    

    private List getListData() 
      mModelList = new ArrayList<>();
      for (int i = 1; i <= 25; i++) 
          mModelList.add(new Model("TextView " + i));
      
     return mModelList;
    

Model.java

public class Model 

    private String text;
    private boolean isSelected = false;

    public Model(String text) 
      this.text = text;
    

    public String getText() 
      return text;
    

    public void setSelected(boolean selected) 
      isSelected = selected;
    


    public boolean isSelected() 
      return isSelected;
    

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter 

    private List mModelList;

    public RecyclerViewAdapter(List modelList) 
      mModelList = modelList;
    

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, parent, false);
       return new MyViewHolder(view);
    

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) 
        final Model model = mModelList.get(position);
        holder.textView.setText(model.getText());
        holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
        holder.textView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                model.setSelected(!model.isSelected());
                holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
            
        );
    

    @Override
    public int getItemCount() 
        return mModelList == null ? 0 : mModelList.size();
    

    public class MyViewHolder extends RecyclerView.ViewHolder 

        private View view;
        private TextView textView;

        private MyViewHolder(View itemView) 
            super(itemView);
            view = itemView;
            textView = (TextView) itemView.findViewById(R.id.text_view);
        
    

¿Como funciona?
onBindViewHolder() El método enlaza los datos de ArrayList a los objetos View. Entonces, a tiempo al vincular los datos a la vista, obtiene el objeto único de ArrayList que es Model model = mModelList.get(position); con la posición actual. Ahora debemos verificar si ese objeto en particular está seleccionado o no. Como esto,

model.isSelected()

que devuelve true o false. Si ese objeto ya está seleccionado, debemos cambiar el color de fondo de row_item seleccionado. Para esto aquí está el código

holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);

Si está seleccionado, cambie el color de fondo a cyan demás white.

Para la selección necesitamos usar setOnClickListener() método. (aquí estoy usando solo un TextView. Así que estoy realizando un evento de clic en TextView). Aquí holder.view significa el single completo item_row. Al hacer clic, alternar los valores booleanos a true o false.

 holder.textView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            model.setSelected(!model.isSelected());
            holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
        
 );

En su actividad o fragmento que aloja RecyclerView, puede obtener los objetos / elementos seleccionados como este

String text = "";
 for (Model model : mModelList) 
   if (model.isSelected()) 
     text += model.getText();
   
 
Log.d("TAG","Output : " + text);

Aquí está la salida

producción

Edición 1: Restringir al usuario para que seleccione solo un elemento.

 private int lastSelectedPosition = -1;  // declare this variable
 ...
 // your code
 ...


 @Override
public void onBindViewHolder(final MyViewHolder holder, int position) 
    final Model model = mModelList.get(position);
    holder.textView.setText(model.getText());
    holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
    holder.textView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            // check whether you selected an item

            if(lastSelectedPosition > 0) 
                mModelList.get(lastSelectedPosition).setSelected(false);
            

            model.setSelected(!model.isSelected());
            holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);

            // store last selected item position 

            lastSelectedPosition = holder.getAdapterPosition();  
        
    );

Espero que sea util.

La creación de la implementación de selección múltiple personalizada mencionada funciona correctamente, pero puede tener problemas de rendimiento cuando el conjunto de datos es enorme. Recomiendo encarecidamente leer la sección "Creación de la vista de reciclaje: habilitar la selección de elementos de la lista" documentación de Google. He enumerado el enlace Documentación de Android para crear reciclar, ver y habilitar el elemento, haga clic

public class RecyclerColorAdapter extends RecyclerView.Adapter 


        private final Activity activity;
        private final ArrayList itemArrayList;


        public RecyclerColorAdapter(Activity activity, ArrayList itemArrayList) 
            super();
            this.activity = activity;
            this.itemArrayList = itemArrayList;
        


        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) 
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_color_recycleview, viewGroup, false);
            return new ViewHolder(v);
        

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int i) 
            holder.setIsRecyclable(true);

            final ColorItem colorItem = itemArrayList.get(i);


            holder.button_color.setText(colorItem.getColorName());

            holder.button_color.setBackgroundColor(colorItem.isSelected() ? Color.CYAN : Color.WHITE);

            holder.button_color.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    colorItem.setSelected(!colorItem.isSelected());
                    holder.button_color.setBackgroundColor(colorItem.isSelected() ? Color.CYAN : Color.WHITE);
                    if (colorItem.isSelected())
                        arrayListColor.add("diamond_color[]="+colorItem.getValue()+"&");
                        Log.e("arrayListColor","---------"+arrayListColor);
                    
                    else 
                        arrayListColor.remove("diamond_color[]="+colorItem.getValue()+"&");
                        Log.e("arrayListColor","---------"+arrayListColor);
                    


                
            );

        

        @Override
        public int getItemCount() 

            return itemArrayList.size();
        

        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 

            private Button button_color;

            public ViewHolder(View itemView) 
                super(itemView);
                itemView.setOnClickListener(this);
                button_color = (Button) itemView.findViewById(R.id.button_color);

            

            @Override
            public void onClick(View v) 

            

        

    

Recuerda algo, que tienes autorización de comentar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *