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 unRadioButton
en la fila, etc.).Mantenga un registro de la selección al nivel de su
RecyclerView.Adapter
. En mi caso, unChoiceCapableAdapter
maneja eso, junto con una claseSingleChoiceMode
que implementa una estrategiaChoiceMode
.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()
enRecyclerView
puede ayudar aquí: si realiza un seguimiento de laposition
de la última opción,findViewHolderForPosition()
puede darle elViewHolder
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 !