Obtener elemento de ListView sólo con OnTouchListener

En mi aplicación tengo un listener para mi ListView. Con el TouchListener soy capaz de obtener las coordenadas X e Y del evento táctil. Ahora quiero conseguir el artículo chascado del ListView. ¿Cómo puedo obtener la posición del elemento de clic en el listView sólo con un onTouchListener? No quiero usar un onItemClickedListener.

 switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: { if (mPaused) { return false; } // TODO: ensure this is a finger, and set a flag // Find the child view that was touched (perform a hit test) Rect rect = new Rect(); int childCount = mListView.getChildCount(); int[] listViewCoords = new int[2]; mListView.getLocationOnScreen(listViewCoords); int x = (int) motionEvent.getRawX() - listViewCoords[0]; int y = (int) motionEvent.getRawY() - listViewCoords[1]; View child; for (int i = 0; i < childCount; i++) { child = mListView.getChildAt(i); child.getHitRect(rect); if (rect.contains(x, y)) { mDownView = child; // This is your down view break; } } if (mDownView != null) { mDownX = motionEvent.getRawX(); mDownPosition = mListView.getPositionForView(mDownView); mVelocityTracker = VelocityTracker.obtain(); mVelocityTracker.addMovement(motionEvent); } view.onTouchEvent(motionEvent); return true; } 

Lo obtengo de SwipeListView Jake Wharton

Si no es obligatorio que utilice un TouchListener , recomiendo usar un OnItemClickListener . Simplemente simplificará su vida.

Aparte de eso, tendrás que obtener el desplazamiento actual y desplazar la posición del ListView , la altura de cada fila y luego hacer un poco de matemáticas para determinar si el punto (x, y) se encuentra en el polígono de cada fila. Dado que las filas son rectángulos que las matemáticas no es demasiado difícil, pero utilizando OnItemClickListener sería mucho, mucho más fácil.

Además, si necesita usar TouchListener , también podría usar OnItemClickListener para establecer un valor en su clase Adapter (o en otro lugar) que indique el elemento más reciente que se ha hecho clic. A continuación, en su TouchListener podría comprobar ese valor y utilizarlo para correlacionar la coordenada (x, y) y el elemento ListView . Esto, por supuesto, depende de que OnItemClickListener se ejecute primero. Si la inversa es verdadera, podría hacer que funcione, pero en lugar de eso almacene la posición táctil al usar el TouchListener y luego OnItemClickListener en OnItemClickListener .

La mejor manera de utilizar estos métodos pointToPosition (int x, int y) y pointToRowId (int x, int y)

Tu clase puede implementar tanto View.OnTouchListener, AdapterView.OnItemClickListener

 @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(motionEvent.getAction() == MotionEvent.ACTION_UP){ Log.d(TAG, "ontouch: UP"); **// Here you can figure if it was simple item click event. // We return false only when user touched once on the view. // this will be handled by onItemClick listener.** if(lastAction == -1){ lastAction = MotionEvent.ACTION_UP; view.clearFocus(); return true; } return false; } else if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ Log.d(TAG, "ontouch: DOWN"); return false; } else { // This is all action events. lastAction = -1; return true; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // We come here after onTouch event figured out that its a simple touch event and needs to be handled here. } 
  • Limitación de Drag de ImageView en Android
  • Cambiar la altura del diseño relativo con la misma velocidad que el dedo del usuario Se mueve en el diseño
  • Cómo implementar tanto ontouch y también onfling en un mismo listview?
  • Imagen en lienzo con eventos táctiles
  • OnTouchListener para toda la pantalla
  • Android deja de enviar eventos onTouch
  • ¿Cómo manejar hacer clic en las vistas secundarias y tocar en los ViewGroups de los padres?
  • Incorporación de ListView dentro de la Galería
  • OnTouch funciona, pero OnClickListener no?
  • Analog SetOnTouchListener o cómo se utiliza en xamarin, qué argumento debe ser
  • Obtener coordenadas reales de xy de los usuarios
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.