Single tap, long tap and swipe in ListView
Метки android
Опишу, как можно обработать простое нажатие на listview item, долгий тап и swipe. Кстати, как это по-русски сказать, когда пальцем проводишь? Для Swipe использую SwipeListViewActivity. http://andhradroid.wordpress.com/201...d-like-iphone/
В getListView() добавляю setOnItemLongClickListener для обработки долгого тапа.
![]() При нажатии отрабатывает и click и long click ![]() |
Всего комментариев 2
Комментарии
-
Переписал код. Теперь все гуд. Убрал обработку Long Tap в MyGestureDetector.
Теперь это выглядит так:
Java(TM) 2 Platform Standard Edition 5.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
package ru.chizz.develop.skills; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.widget.ListAdapter; import android.widget.ListView; public abstract class SwipeListViewActivity extends Activity { private ListView list; private int REL_SWIPE_MIN_DISTANCE; private int REL_SWIPE_MAX_OFF_PATH; private int REL_SWIPE_THRESHOLD_VELOCITY; /** * * @return ListView */ public abstract ListView getListView(); /** * * @param isRight * Swiping direction * @param position * which item position is swiped */ public abstract void getSwipeItem(boolean isRight, int position); /** * For single tap/Click * * @param adapter * @param position */ public abstract void onItemClickListener(ListAdapter adapter, int position); public abstract void OnItemLongClickListener(ListAdapter adapter, int position); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DisplayMetrics dm = getResources().getDisplayMetrics(); REL_SWIPE_MIN_DISTANCE = (int) (120.0f * dm.densityDpi / 160.0f + 0.5); REL_SWIPE_MAX_OFF_PATH = (int) (250.0f * dm.densityDpi / 160.0f + 0.5); REL_SWIPE_THRESHOLD_VELOCITY = (int) (200.0f * dm.densityDpi / 160.0f + 0.5); } @Override protected void onResume() { super.onResume(); list = getListView(); if (list == null) { new Throwable("Listview not set exception"); } @SuppressWarnings("deprecation") final GestureDetector gestureDetector = new GestureDetector( new MyGestureDetector()); View.OnTouchListener gestureListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }; list.setOnTouchListener(gestureListener); } private void myOnItemClick(int position) { if (position < 0) return; onItemClickListener(list.getAdapter(), position); } class MyGestureDetector extends SimpleOnGestureListener { private int temp_position = -1; @Override public void onLongPress(MotionEvent e) { // do your tasks here int pos = list.pointToPosition((int) e.getX(), (int) e.getY()); OnItemLongClickListener(list.getAdapter(), pos); } // Detect a single-click and call my own handler. @Override public boolean onSingleTapUp(MotionEvent e) { int pos = list.pointToPosition((int) e.getX(), (int) e.getY()); myOnItemClick(pos); return true; } @Override public boolean onDown(MotionEvent e) { temp_position = list .pointToPosition((int) e.getX(), (int) e.getY()); return super.onDown(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { int pos = list .pointToPosition((int) e1.getX(), (int) e2.getY()); if (pos >= 0 && temp_position == pos) getSwipeItem(false, pos); } else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { int pos = list .pointToPosition((int) e1.getX(), (int) e2.getY()); if (pos >= 0 && temp_position == pos) getSwipeItem(true, pos); } return false; } } }
Java(TM) 2 Platform Standard Edition 5.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.view.MenuItem; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends SwipeListViewActivity { private ListView lvMain; float historicX = Float.NaN, historicY = Float.NaN; static final int DELTA = 50; enum Direction {LEFT, RIGHT;} .... scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to); lvMain= (ListView) findViewById(R.id.lvMain); lvMain.setAdapter(scAdapter); @Override public ListView getListView() { return lvMain; } @Override public void getSwipeItem(boolean isRight, int position) { Toast.makeText(this, "Swipe to " + (isRight ? "right" : "left") + " direction" + " position =" + position, Toast.LENGTH_SHORT).show(); } @Override public void onItemClickListener(ListAdapter adapter, int position) { String s = (String)((Cursor)lvMain.getItemAtPosition(position)).getString(1); Toast.makeText(this, "Single tap on item position " + position + " Selected Item:" + s , Toast.LENGTH_SHORT).show(); } @Override public void OnItemLongClickListener(ListAdapter adapter, int position) { // TODO Auto-generated method stub String s = (String)((Cursor)lvMain.getItemAtPosition(position)).getString(1); Toast.makeText(this, "Long tap on item position " + position + " Selected Item:" + s , Toast.LENGTH_SHORT).show(); }
Запись от chizz размещена 19.06.2013 в 16:40 -
выкладывать неотформатированный код при всех возможностях нынешних IDE...это надо уметь...
Запись от Jupiter размещена 19.06.2013 в 21:24