when studio setcolorschemecolors scrolling recyclerview recargar pulltorefresh pullrefresh onrefresh how down android android-recyclerview multi-select

android - studio - ¿Cómo implementar multiselección en RecyclerView?



recargar un recyclerview (3)

La creación de la mencionada implementación personalizada de selección múltiple funciona correctamente, pero puede tener problemas de rendimiento cuando el conjunto de datos es enorme. Recomiendo leer la sección "Crear vista de reciclado - habilitar la selección de elemento de lista" por google. He enumerado el enlace de la documentación de Android para crear el reciclaje.

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


Sé que es un poco tarde para responder esta pregunta. Y no sé si cumple con los requisitos de OP o no. Pero esto puede ayudar a alguien. Implementé este RectyclerView multi-selección 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++) { 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<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); } } }

¿Como funciona? onBindViewHolder() método onBindViewHolder() vincula los datos de ArrayList a los objetos Ver. Por lo tanto, a tiempo vinculando los datos a la vista obtiene el único objeto de ArrayList que es Model model = mModelList.get(position); con la posición actual. Ahora necesitamos verificar 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 solo TextView . Por lo tanto, estoy realizando un clic en evento en TextView ). Aquí holder.view significa todo el item_row . Onclick 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 a 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

Editar 1: Restringir al usuario para seleccionar 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.


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) { } } }