Tengo un RecyclerView con un cuadro de texto TextView y un botón de visualización ImageView. Tengo un botón fuera de la vista del reciclador que hace que el botón cruzado ImageView sea visible / desaparecido.
Estoy buscando eliminar un elemento de la vista del reciclador, cuando ese elemento cruza el botón ImageView.
Mi adaptador:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
private ArrayList<String> mDataset;
private static Context sContext;
public MyAdapter(Context context, ArrayList<String> myDataset) {
mDataset = myDataset;
sContext = context;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mNameTextView.setOnClickListener(MyAdapter.this);
holder.mNameTextView.setOnLongClickListener(MyAdapter.this);
holder.mNameTextView.setTag(holder);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mNameTextView.setText(mDataset.get(position));
}
@Override
public int getItemCount() {
return mDataset.size();
}
@Override
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onLongClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
mDataset.remove(holder.getPosition());
notifyDataSetChanged();
Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list",
Toast.LENGTH_SHORT).show();
}
return false;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mNumberRowTextView;
public TextView mNameTextView;
public ViewHolder(View v) {
super(v);
mNameTextView = (TextView) v.findViewById(R.id.nameTextView);
}
}
}
Mi diseño es:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:id="@+id/layout">
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="5dp"
android:background="@drawable/greyline"/>
<ImageView
android:id="@+id/crossButton"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_marginLeft="50dp"
android:src="@drawable/cross" />
</LinearLayout>
¿Cómo puedo obtener algo como un onClick que funcione para mi CrossButton ImageView? ¿Hay una mejor manera? ¿Tal vez cambiar todo el elemento al hacer clic en quitar el elemento? La vista de reciclaje muestra una lista de ubicaciones que deben editarse. Cualquier consejo técnico o comentario / sugerencia sobre la mejor implementación sería muy apreciado.
java
android
user-interface
android-recyclerview
selection
Veintinueve
fuente
fuente
Respuestas:
He hecho algo similar En su
MyAdapter
:Espero que esto ayude.
Editar:
getPosition()
ahora está en desuso, usegetAdapterPosition()
en su lugar.fuente
notifyItemRangeChanged(getPosition, mDataSet.size());
a la respuesta de paradite después de eliminar el elemento para que todas las vistas debajo del elemento eliminado se ajusten en consecuencia.getPosition()
ahora está en desusonotifyItemRemoved(position)
no fue suficiente.En primer lugar, el elemento debe eliminarse de la lista.
luego:
fuente
si todavía no se eliminó el elemento, use este método mágico :)
Versión Kotlin
fuente
Problema
RecyclerView
es, por defecto, desconoce los cambios en su conjunto de datos. Esto significa que siempre que realice una eliminación / adición en su lista de datos, esos cambios no se reflejarán directamente en su RecyclerView.Solución
RecyclerView le ofrece algunos métodos para compartir su estado de conjunto de datos. Esto sucede porque una modificación en su conjunto de datos no implica un cambio de vista, y viceversa. Las API de Android estándar le permiten vincular el proceso de eliminación de datos (a los efectos de la pregunta) con el proceso de eliminación de vistas.
Mejor enfoque
Si no especifica correctamente lo que sucede al agregar / eliminar elementos (hablando de vistas), los niños RecyclerView se animan sin responder debido a la falta de información sobre cómo mover las diferentes vistas alrededor de la lista.
En cambio, el siguiente código reproducirá con precisión la animación, solo en el elemento secundario que se está eliminando (y como nota al margen, para mí arregló cualquier
IndexOutOfBoundException
s, marcado por el seguimiento de la pila como "inconsistencia de datos")Debajo del capó, si analizamos
RecyclerView
podemos encontrar documentación que explica que el segundo parámetro que tenemos que pasar es el número de elementos que se eliminan del conjunto de datos, no el número total de elementos (como se indicó erróneamente en algunas otras fuentes de información).fuente
Posiblemente una respuesta duplicada pero bastante útil para mí. Puede implementar el método que se proporciona a continuación
RecyclerView.Adapter<RecyclerView.ViewHolder>
y puede usar este método según sus requisitos, espero que funcione para ustedfuente
Aquí hay algunos ejemplos visuales suplementarios. Vea mi respuesta más completa para ver ejemplos de agregar y quitar un rango.
Añadir elemento individual
Agregue "Pig" en el índice
2
.Eliminar un solo artículo
Eliminar "Pig" de la lista.
fuente
Intenté todas las respuestas anteriores, pero insertar o eliminar elementos para la vista de reciclaje causa problemas con la posición en el conjunto de datos. Terminé usando
delete(getAdapterPosition());
dentro de viewHolder, que funcionó muy bien para encontrar la posición de los elementos.fuente
El problema que tuve fue que estaba eliminando un elemento de la lista que ya no estaba asociado con el adaptador para asegurarme de que está modificando el adaptador correcto, puede implementar un método como este en su adaptador:
Y llámalo en tu fragmento o actividad así:
fuente
Espero que esto te ayude.
fuente
si desea eliminar el elemento, debe hacer esto: primero elimine el elemento:
en el siguiente paso, debe notificar a su adaptador de reciclador que elimina un artículo mediante este código:
pero si cambia un elemento, haga esto: primero cambie un parámetro de su objeto como este:
o nuevo así:
luego notifique a su adaptador de reciclador que modifica un artículo con este código:
La esperanza te ayuda.
fuente
fuente
notifyItemRemoved(position)
.Al método
onBindViewHolder
escriba este códigofuente
En caso de que alguien quiera implementar algo como esto en la clase Main en lugar de la clase Adapter, puede usar:
donde friendsListRecycler es el nombre del adaptador
fuente
fuente
convertir la interfaz en una clase de adaptador personalizada y gestionar el evento de clic en la vista de reciclador.
después de definir el adaptador y vincularlo a la vista del reciclador llamado código a continuación.
fuente
En caso de que se pregunte como yo, ¿dónde podemos obtener la posición del adaptador en el método getadapterposition (); está en el objeto viewholder.así que tienes que poner tu código así
fuente
fuente