Форум программистов, компьютерный форум, киберфорум
Наши страницы
chizz
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Single tap, long tap and swipe in ListView

Запись от chizz размещена 19.06.2013 в 14:56
Обновил(-а) chizz 19.06.2013 в 16:04
Метки android

Опишу, как можно обработать простое нажатие на listview item, долгий тап и swipe. Кстати, как это по-русски сказать, когда пальцем проводишь?

Для Swipe использую SwipeListViewActivity. http://andhradroid.wordpress.com/201...d-like-iphone/

Java
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
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.view.ViewGroup;
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);
 
@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;
 
// 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;
}
 
}
 
}
В Main Activity использую этот SwipeListViewActivity и реализую абстрактные методы.

В getListView() добавляю setOnItemLongClickListener для обработки долгого тапа.

Java
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
public class MainActivity extends SwipeListViewActivity {
 
private ListView lvMain;
 
float historicX = Float.NaN, historicY = Float.NaN;
    static final int DELTA = 50;
    enum Direction {LEFT, RIGHT;}
 
@Override
     public ListView getListView() {
         lvMain.setOnItemLongClickListener(new OnItemLongClickListener() {
              public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                    //do your stuff here
                  Toast.makeText(getApplicationContext(), "Long tap on item position " + position,
                             Toast.LENGTH_SHORT).show();
                  return true;
                  }
         });
     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) {
     Toast.makeText(this, "Single tap on item position " + position,
     Toast.LENGTH_SHORT).show();
     }
    
}
ЗЫ. Косяк

При нажатии отрабатывает и click и long click
Размещено в Без категории
Просмотров 2187 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для chizz
    Переписал код. Теперь все гуд. Убрал обработку 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 chizz вне форума
  2. Старый комментарий
    выкладывать неотформатированный код при всех возможностях нынешних IDE...это надо уметь...
    Запись от Jupiter размещена 19.06.2013 в 21:24 Jupiter вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru