with recyclerview problem android listview android-recyclerview android-checkbox

android - problem - Modo de elección en un RecyclerView?



listview with checkbox in android (4)

Creé una biblioteca para este tipo de modo de elección aplicado a RecyclerView, quizás pueda ayudar:

Descripción

Esta biblioteca ha sido creada para ayudar a la integración de una selección de selección múltiple al RecyclerView

Implementación

La integración con Gradle es muy fácil, solo necesitas el repositorio jcenter y la biblioteca:

repositories { jcenter() } ... dependencies { compile ''com.davidecirillo.multichoicerecyclerview:multichoicerecyclerview:1.0.1'' }

Pasos principales para el uso

Agregue MultiChoiceRecyclerView a su archivo xml

<com.davidecirillo.multichoicesample.MultiChoiceRecyclerView android:id="@+id/multiChoiceRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />

Instanciate tu objeto y conecta la vista

MultiChoiceRecyclerView mMultiChoiceRecyclerView = (MultiChoiceRecyclerView) findViewById(R.id.multiChoiceRecyclerView);

Extienda su adaptador al MultiChoiceAdapter y agréguelo al RecyclerView según el uso normal

public class MyAdapter extends MultiChoiceAdapter<MyViewHolder> { public MyAdapter(ArrayList<String> stringList, Context context) { this.mList = stringList; this.mContext = context; } ... } MyAdapter myAdapter = new MyAdapter(mList, getApplicationContext()); mMultiChoiceRecyclerView.setAdapter(myAdapter);

Para obtener más información y personalizaciones: https://github.com/dvdciri/MultiChoiceRecyclerView

Estoy tratando de descubrir cómo lograr el mismo efecto de

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

en una implementación de RecyclerView. Por favor ayuda.


No hay opciones para el modo de elección en recyclerview. Tenemos que agregar nuestra propia lógica tanto para la opción única como para la opción múltiple. Para Single Choice Recyclerview , agregué mi fuente a gitHub , solo échale un vistazo.


No hay soporte incorporado para una estructura de "modo de elección" con RecyclerView . Sus opciones son rodarlo usted mismo o utilizar una biblioteca de terceros que lo ofrezca. La biblioteca DynamicRecyclerView ofrece modos de elección, pero no lo he probado.

Esta aplicación de ejemplo demuestra la implementación usted mismo, en este caso, utilizando el estado activado para indicar cuál es la opción actual. El patrón general es:

  • Haga que su RecyclerView.ViewHolder detecte una operación de UI que indique una elección (haga clic en una fila, haga clic en un RadioButton en la fila, etc.).

  • Mantenga un registro de la selección al nivel de su RecyclerView.Adapter . En mi caso, un ChoiceCapableAdapter maneja eso, junto con una clase SingleChoiceMode que implementa una estrategia ChoiceMode .

  • Cuando se realiza una elección, actualice la fila recién elegida para reflejar la elección y actualice la fila elegida previamente para reflejar que ya no se elige. findViewHolderForPosition() en RecyclerView puede ayudar aquí: si realiza un seguimiento de la position de la última opción, findViewHolderForPosition() puede darle el ViewHolder para esa opción, para que pueda "des-elegir".

  • Haga un seguimiento de la elección entre los cambios de configuración, poniéndolo en el estado de la instancia guardada de la actividad o fragmento que está administrando RecyclerView .


Puedes seguir esto:

- Datos (String name, boolean selected)

- Adaptador con itemClickListener

- Actividad o fragmento

- activity_main (recyclerView)

- list_item (TextView, CheckBox)

Datos

public class MultipleData { private String mTitle; private boolean mBoolean; public MultipleData(String title, boolean mBoolean) { this.mTitle = title; this.mBoolean = mBoolean; } public String getTitle() { return mTitle; } public void setTitle(String mTitle) { this.mTitle = mTitle; } public boolean isBoolean() { return mBoolean; } public void setBoolean(boolean mBoolean) { this.mBoolean = mBoolean; } }

Sus puntos de vista activity_main.xml (recyclerView)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.thedeveloperworldisyours.fullrecycleview.multiple.MultipleFragment"> <android.support.v7.widget.RecyclerView android:id="@+id/multiple_fragment_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>

y list_item.xml (TextView, CheckBox)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/multiple_list_item_text" android:layout_width="match_parent" android:layout_height="90dp" android:text="@string/app_name" android:typeface="monospace" android:layout_toLeftOf="@+id/multiple_list_item_check_button" android:gravity="center" android:textSize="@dimen/multiple_list_item_size_rock_stars"/> <RadioButton android:id="@+id/multiple_list_item_check_button" android:layout_width="wrap_content" android:layout_height="90dp" android:layout_alignParentRight="true" android:checked="false" android:clickable="false" android:focusable="false" /> </RelativeLayout>

Adaptador con ClickListener

public class MultipleRecyclerViewAdapter extends RecyclerView .Adapter<MultipleRecyclerViewAdapter .DataObjectHolder> { private List<MultipleData> mList; private static MultipleClickListener sClickListener; MultipleRecyclerViewAdapter(List<MultipleData> mList) { this.mList = mList; } static class DataObjectHolder extends RecyclerView.ViewHolder implements View .OnClickListener { TextView mTextView; RadioButton mRadioButton; DataObjectHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.multiple_list_item_text); mRadioButton = (RadioButton) itemView.findViewById(R.id.multiple_list_item_check_button); itemView.setOnClickListener(this); } @Override public void onClick(View v) { sClickListener.onItemClick(getAdapterPosition(), v); } } void changedData(int position) { if (mList.get(position).isBoolean()) { mList.get(position).setBoolean(false); } else { mList.get(position).setBoolean(true); } notifyDataSetChanged(); } void setOnItemClickListener(MultipleClickListener myClickListener) { this.sClickListener = myClickListener; } @Override public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.multiple_list_item, parent, false); DataObjectHolder dataObjectHolder = new DataObjectHolder(view); return dataObjectHolder; } @Override public void onBindViewHolder(DataObjectHolder holder, int position) { holder.mTextView.setText(mList.get(position).getTitle()); holder.mRadioButton.setChecked(mList.get(position).isBoolean()); } @Override public int getItemCount() { return mList.size(); } interface MultipleClickListener { void onItemClick(int position, View v); } }

Actividad o fragmento

public class MultipleFragment extends Fragment implements MultipleRecyclerViewAdapter.MultipleClickListener{ MultipleRecyclerViewAdapter mAdapter; public MultipleFragment() { // Required empty public constructor } public static MultipleFragment newInstance() { return new MultipleFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.multiple_fragment, container, false); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.multiple_fragment_recycler_view); MultipleData hendrix = new MultipleData("Jimi Hendrix", false); MultipleData bowie = new MultipleData("David Bowie", false); MultipleData morrison = new MultipleData("Jim Morrison", false); MultipleData presley = new MultipleData("Elvis Presley", false); MultipleData jagger = new MultipleData("Mick Jagger", false); MultipleData cobain = new MultipleData("Kurt Cobain", false); MultipleData dylan = new MultipleData("Bob Dylan", false); MultipleData lennon = new MultipleData("John Lennon", false); MultipleData mercury = new MultipleData("Freddie Mercury", false); MultipleData elton = new MultipleData("Elton John", false); MultipleData clapton = new MultipleData("Eric Clapton", false); List<MultipleData> list = new ArrayList<>(); list.add(0, hendrix); list.add(1, bowie); list.add(2, morrison); list.add(3, presley); list.add(4, jagger); list.add(5, cobain); list.add(6, dylan); list.add(7, lennon); list.add(8, mercury); list.add(9, elton); list.add(10, clapton); mAdapter = new MultipleRecyclerViewAdapter(list); recyclerView.setAdapter(mAdapter); recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); mAdapter.setOnItemClickListener(this); return view; } @Override public void onItemClick(int position, View v) { mAdapter.changedData(position); } }

¡Puedes ver este ejemplo en GitHub y esta publicación para múltiples opciones , y esta publicación para código Happy choice único !