Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo implementar multi-select en RecyclerView?

Esto se implementa usando ListView

ListView tenía un modo de opción múltiple, ¿qué debo usar para implementar el mismo usando RecyclerView? ¿Cómo manejar onItemCheckedStateChanged? Comprobé esto , pero no pude sacar mucho de esto. Cualquier fragmento de código o un proyecto de ejemplo que implementa el mismo sería genial. Gracias por adelantado.

  • Recyclerview lag en desplazamiento debido a los anuncios de Admob
  • Recycleview muestra diferentes tipos de vistas
  • Reemplazar ListView con RecyclerView
  • Actualización de un ProgressBar en un RecyclerView
  • Crear menú de opciones para RecyclerView-Item
  • Obtener elementos visibles en RecyclerView
  • Android: Elemento RecyclerView cuando se establece en bloques que se pueden hacer clic en eventos onTouch
  • Admob Native Ads dentro de un Recylerview muestra espacio en blanco antes de cargar
  • 2 Solutions collect form web for “¿Cómo implementar multi-select en RecyclerView?”

    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 ser útil para alguien. Implementé este RectyclerView multi-select con un simple truco. Aquí está mi código.

    Activity_main.xml

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#EEE"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 

    Item_row.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="1dp" android:background="#FFF" android:clickable="true" android:orientation="vertical"> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" tools:text="TextView" /> </LinearLayout> 

    En item_row.xml android:clickable="true" es importante.

    MainActivity.java

     public class MainActivity extends AppCompatActivity { private List<Model> 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<Model> getListData() { mModelList = new ArrayList<>(); for (int i = 1; i <= 25; i++) { modelList.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<RecyclerViewAdapter.MyViewHolder> { private List<Model> mModelList; public RecyclerViewAdapter(List<Model> 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); } } } 

    ¿Cómo funciona? onBindViewHolder() método onBindViewHolder() enlaza los datos de ArrayList con los objetos View. Por lo tanto, a tiempo vinculante de los datos a la vista que obtiene el único objeto de ArrayList que es Model model = mModelList.get(position); Con la posición actual. Ahora debemos comprobar si ese objeto particular está seleccionado o no. Me gusta esto,

     model.isSelected() 

    Que devuelve true o false . Si ese objeto ya está seleccionado, necesitamos 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 else white .

    Para la selección necesitamos usar el método setOnClickListener() . (Aquí estoy usando sólo un TextView . Así que estoy realizando evento de clic en TextView ). En holder.view caso, holder.view significa todo el item_row . Onclick cambia 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 está hospedando 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

    salida

    Espero que sea util.

     public class RecyclerColorAdapter extends RecyclerView.Adapter<RecyclerColorAdapter.ViewHolder> { private final Activity activity; private final ArrayList<ColorItem> itemArrayList; public RecyclerColorAdapter(Activity activity, ArrayList<ColorItem> 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) { } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.