viewholder studio seleccionar recyclerview propiedades item eventos eliminar elemento botones android xamarin.android android-recyclerview

android - studio - Creación de botones y clic de botón debajo del elemento recyclerview cuando se pasa(swip to dismiss) sin usar la biblioteca



seleccionar item recyclerview (2)

Tuve el mismo problema que el tuyo. Codifiqué medio día y finalmente encontré una forma.

En primer lugar, creo que este es el problema de Android ItemTouchHelper que no hay métodos para resolver eso.

Por lo tanto, no puede usar ItemTouchHelper ni otros métodos del sistema.

Lo que hago es esto: 1. Configure recylerView.setOnTouchListener para obtener (x, y) en la pantalla.

  1. Cuando ItemTouchHelper onSwiped (), establezca un estado y encuentre la región en la que se puede hacer clic.

  2. Verifica tu punto de contacto si toca la región del icono.

  3. Haga algo cuando sea golpeado en su método onTouch ().

Puedes encontrar mi solución en mi Repo de Github. https://github.com/TindleWei/WindGod

Aquí 3 formas de usar ItemTouchHelper:

  1. forma normal de Android como la tuya

  2. foregound y región de fondo forma

  3. modo viewpager

En mi repositorio, puedes mirar de 2da manera.

Estoy usando RecyclerView para mostrar mi lista. Implemento Deslizar para descartar en el RecyclerView con ItemTouchHelper. El diseño subyacente se implementa en el método OnchildDraw mediante el uso de lienzo. Ahora tengo un problema: quiero hacer clic en mi ícono. Al hacer clic en el icono, quiero hacer algunas funciones. Aquí está Mi clase:

public class ItemTouchHelperCallback : ItemTouchHelper.SimpleCallback { private ContactSearchedResultAdapter _adapter; private RecyclerView _mRecyclerView; private int _swipeCount; private Android.Content.Res.Resources _resources; public ItemTouchHelperCallback(ContactSearchedResultAdapter adapter, RecyclerView mRecyclerView, Android.Content.Res.Resources resources) : base(0, ItemTouchHelper.Left | ItemTouchHelper.Right) { this._adapter = adapter; this._mRecyclerView = mRecyclerView; this._resources = resources; } public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction) { if (direction == ItemTouchHelper.Left) { _adapter.RemoveViewWithDialog(viewHolder.AdapterPosition, _mRecyclerView, _swipeCount); if (_swipeCount == 0) _swipeCount++; } else { _adapter.SaveContactToDataBase(viewHolder.AdapterPosition, _mRecyclerView); } } public override void OnChildDraw(Canvas cValue, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, bool isCurrentlyActive) { Paint paint = new Paint(); View itemView = viewHolder.ItemView; float height = (float)itemView.Bottom - (float)itemView.Top; float width = height / 3; Bitmap icon; if (dX > 0) { paint.Color = Color.ParseColor("#388E3C"); RectF background = new RectF((float)itemView.Left, (float)itemView.Top, dX, (float)itemView.Bottom); cValue.DrawRect(background, paint); icon = BitmapFactory.DecodeResource(_resources, Resource.Drawable.addoption); RectF icon_dest = new RectF((float)itemView.Left + width, (float)itemView.Top + width, (float)itemView.Left + 2 * width, (float)itemView.Bottom - width); cValue.DrawBitmap(icon, null, icon_dest, paint); } else { paint.Color = Color.ParseColor("#D32F2F"); RectF background = new RectF((float)itemView.Right + dX, (float)itemView.Top, (float)itemView.Right, (float)itemView.Bottom); cValue.DrawRect(background, paint); icon = BitmapFactory.DecodeResource(_resources, Resource.Drawable.removeoption); RectF icon_dest = new RectF((float)itemView.Right - 2 * width, (float)itemView.Top + width, (float)itemView.Right - width, (float)itemView.Bottom - width); cValue.DrawBitmap(icon, null, icon_dest, paint); } float alpha = (float)1.0- Math.Abs(dX)/(float) itemView.Width; itemView.Alpha = alpha; itemView.TranslationX = dX; base.OnChildDraw(cValue, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } }

Como puede ver, estoy llamando a ItemRemoving o ItemSaving en el método OnSwiped. Lo que quiero hacer ahora es llamar a estos métodos al hacer clic en los íconos (íconos dibujados por lienzo en OnchildDraw). Busqué mucho sobre este tema y no pude encontrar ninguna solución que implementara esta característica sin usar ninguna biblioteca. No quiero usar la biblioteca.


Para aquellos que usan la solución número 2 de AdamWei, si tiene problemas con el reciclador vista ontouchlistener en un fragmento, cambie la siguiente línea:

Point point = new Point((int)motionEvent.getRawX(), (int)motionEvent.getRawY());

a

Point point = new Point((int) motionEvent.getX(), (int) motionEvent.getY());