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.xml
android: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
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ó.