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.
- GC y onTouch causan un error de señal fatal 11 (SIGSEGV) en la aplicación que utiliza ffmpeg a través de ndk
- OnTouch dando extraños puntos de contacto Android
- ¿Cómo hacer algo repetidamente mientras se presiona un botón?
- EditText en ListView pierde foco cuando se presiona en Android 4.x
- cómo deslizar un evento button onTouch en android
- Reducir animadamente el tamaño del botón en la prensa y recuperar su tamaño en la versión
- android arrastrar y soltar ImageView onTouchListener
- Arrastrar y soltar imágenes en android
- Android: ¿Cómo determinar el índice de caracteres de la posición de un evento táctil en TextView?
- Disparar Evento táctil desde la vista DialogFragment a la vista de actividad principal
- Android: ImageView getID (); Devolver entero
- Manejo del evento de toque Intercept sin extender ViewGroup
- Hacer diferencias entre setOnClickListener y setOnTouchListener
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. }
- Autocompletetextview con adaptador y filtro personalizados
- Al usar genymotion obtener una pantalla en blanco con la aceptación EULA