ListView中每個item的左右滑動響應,附原始碼
要實現的效果:三星手機上左右滑動任一項聯絡人(ListView的Item),即可進行打電話或發簡訊的操作;備忘軟體Any.Do中,滑動ListView中任一項即可標記為已完成。
作為一個初學者,為了實現這一效果,花了很長時間終於才成功,希望大家支援下{:soso_e113:}。
思路:使用了OnItemClickListener, OnGestureListener,前者用於判斷當前選中的項,後者用於判斷是左右滑動還是直接點選選項。當在一項上滑動時, 會執行onFling,直到手指放開時才會執行onItemClick方法,所以先在onFling 中判斷是否為滑動動作,儲存到一個全域性變數中,然後在onItemClick 中根據這個變數的值就能判斷動作。這樣做也避免了滑動時先響應了onItemClick方法造成的干擾。
Layout中只有一個ListView
[mw_shl_code=xhtml,false]
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
[/mw_shl_code]
Java程式碼如下:
[mw_shl_code=java,true]
public class MainActivity extends Activity implements OnItemClickListener, OnGestureListener {
private GestureDetector gd;
// 事件狀態
private final char FLING_CLICK = 0;
private final char FLING_LEFT = 1;
private final char FLING_RIGHT = 2;
private char flingState = FLING_CLICK;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gd = new GestureDetector(this);
ListView lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1,getData()));
lv.setOnItemClickListener(this);
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("測試資料0");
data.add("測試資料1");
data.add("測試資料2");
data.add("測試資料3");
data.add("測試資料4");
data.add("測試資料5");
data.add("測試資料6");
data.add("測試資料7");
data.add("測試資料8");
data.add("測試資料9");
data.add("測試資料10");
data.add("測試資料11");
data.add("測試資料12");
return data;
}
/**
* 事件處理
* 其中flingState的值為事件
* 引數pos為ListView的每一項
*/
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
// TODO Auto-generated method stub
Log.v("MY_TAG", "onItemClick: state="+flingState+", pos="+pos);
switch(flingState) {
// 處理左滑事件
case FLING_LEFT:
Toast.makeText( this, "Fling Left:"+pos, Toast.LENGTH_SHORT).show();
flingState = FLING_CLICK;
break;
// 處理右滑事件
case FLING_RIGHT:
Toast.makeText( this, "Fling Right:"+pos, Toast.LENGTH_SHORT).show();
flingState = FLING_CLICK;
break;
// 處理點選事件
case FLING_CLICK:
switch(pos) {
case 0:break;
case 1:break;
}
Toast.makeText( this, "Click Item:"+pos, Toast.LENGTH_SHORT).show();
break;
}
}
/**
* 覆寫此方法,以解決ListView滑動被遮蔽問題
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
this.gd.onTouchEvent(event);
return super.dispatchTouchEvent(event);
}
/**
* 覆寫此方法,以使用手勢識別
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v("MY_TAG", "onTouchEvent");
return this.gd.onTouchEvent(event);
}
/**
* 引數解釋:
* e1:第1個ACTION_DOWN MotionEvent
* e2:最後一個ACTION_MOVE MotionEvent
* vX:X軸上的移動速度,畫素/秒
* vY:Y軸上的移動速度,畫素/秒
* 觸發條件 :
* X座標位移大於minX,Y座標位移小於maxY,移動速度大於minV畫素/秒
*
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY)
{
final int minX = 120 ,maxY = 20, minV = 150;
int x1 = (int) e1.getX(), x2 = (int) e2.getX();
int y1 = (int) e1.getY(), y2 = (int) e2.getY();
if( Math.abs(x1-x2)>minX && Math.abs(y1-y2)<maxY && Math.abs(vX)>minV) {
if(x1>x2) {
Log.v("MY_TAG", "Fling Left");
flingState = FLING_LEFT;
}
else {
Log.v("MY_TAG", "Fling Right");
flingState = FLING_RIGHT;
}
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {}
@Override
public void onShowPress(MotionEvent e) {}
@Override
public boolean onDown(MotionEvent e) {return false;}
@Override
public boolean onSingleTapUp(MotionEvent e) {return false;}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX,float dY) {
return false;
}
}
[/mw_shl_code]
原始碼見附件,測試執行正常。
GestureListView.zip
作為一個初學者,為了實現這一效果,花了很長時間終於才成功,希望大家支援下{:soso_e113:}。
思路:使用了OnItemClickListener, OnGestureListener,前者用於判斷當前選中的項,後者用於判斷是左右滑動還是直接點選選項。當在一項上滑動時, 會執行onFling,直到手指放開時才會執行onItemClick方法,所以先在onFling 中判斷是否為滑動動作,儲存到一個全域性變數中,然後在onItemClick 中根據這個變數的值就能判斷動作。這樣做也避免了滑動時先響應了onItemClick方法造成的干擾。
Layout中只有一個ListView
[mw_shl_code=xhtml,false]
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
[/mw_shl_code]
Java程式碼如下:
[mw_shl_code=java,true]
public class MainActivity extends Activity implements OnItemClickListener, OnGestureListener {
private GestureDetector gd;
// 事件狀態
private final char FLING_CLICK = 0;
private final char FLING_LEFT = 1;
private final char FLING_RIGHT = 2;
private char flingState = FLING_CLICK;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gd = new GestureDetector(this);
ListView lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1,getData()));
lv.setOnItemClickListener(this);
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("測試資料0");
data.add("測試資料1");
data.add("測試資料2");
data.add("測試資料3");
data.add("測試資料4");
data.add("測試資料5");
data.add("測試資料6");
data.add("測試資料7");
data.add("測試資料8");
data.add("測試資料9");
data.add("測試資料10");
data.add("測試資料11");
data.add("測試資料12");
return data;
}
/**
* 事件處理
* 其中flingState的值為事件
* 引數pos為ListView的每一項
*/
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
// TODO Auto-generated method stub
Log.v("MY_TAG", "onItemClick: state="+flingState+", pos="+pos);
switch(flingState) {
// 處理左滑事件
case FLING_LEFT:
Toast.makeText( this, "Fling Left:"+pos, Toast.LENGTH_SHORT).show();
flingState = FLING_CLICK;
break;
// 處理右滑事件
case FLING_RIGHT:
Toast.makeText( this, "Fling Right:"+pos, Toast.LENGTH_SHORT).show();
flingState = FLING_CLICK;
break;
// 處理點選事件
case FLING_CLICK:
switch(pos) {
case 0:break;
case 1:break;
}
Toast.makeText( this, "Click Item:"+pos, Toast.LENGTH_SHORT).show();
break;
}
}
/**
* 覆寫此方法,以解決ListView滑動被遮蔽問題
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
this.gd.onTouchEvent(event);
return super.dispatchTouchEvent(event);
}
/**
* 覆寫此方法,以使用手勢識別
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v("MY_TAG", "onTouchEvent");
return this.gd.onTouchEvent(event);
}
/**
* 引數解釋:
* e1:第1個ACTION_DOWN MotionEvent
* e2:最後一個ACTION_MOVE MotionEvent
* vX:X軸上的移動速度,畫素/秒
* vY:Y軸上的移動速度,畫素/秒
* 觸發條件 :
* X座標位移大於minX,Y座標位移小於maxY,移動速度大於minV畫素/秒
*
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY)
{
final int minX = 120 ,maxY = 20, minV = 150;
int x1 = (int) e1.getX(), x2 = (int) e2.getX();
int y1 = (int) e1.getY(), y2 = (int) e2.getY();
if( Math.abs(x1-x2)>minX && Math.abs(y1-y2)<maxY && Math.abs(vX)>minV) {
if(x1>x2) {
Log.v("MY_TAG", "Fling Left");
flingState = FLING_LEFT;
}
else {
Log.v("MY_TAG", "Fling Right");
flingState = FLING_RIGHT;
}
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {}
@Override
public void onShowPress(MotionEvent e) {}
@Override
public boolean onDown(MotionEvent e) {return false;}
@Override
public boolean onSingleTapUp(MotionEvent e) {return false;}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX,float dY) {
return false;
}
}
[/mw_shl_code]
原始碼見附件,測試執行正常。
GestureListView.zip
相關文章
- ListView 實現帶有Filpper效果的左右滑動刪除 ItemView
- ListView,點選每一個Item,如何獲取當前Item的資料?View
- 一對一原始碼,滑塊驗證,滑塊左右滑動顯示的位置原始碼
- 【Android初級】如何實現一個比相簿更高大上的左右滑動特效(附原始碼)Android特效原始碼
- 直播系統原始碼,ViewPager載入大圖 左右滑動原始碼Viewpager
- Listview禁止滑動View
- 短視訊平臺原始碼,介面支援上下、左右的任意滑動原始碼
- Android左右滑動效果的程式碼實現Android
- 左右迴圈滑動的viewpagerViewpager
- 直播平臺原始碼,純JS實現左右滑動輪播圖原始碼JS
- 成品直播原始碼,頂部導航欄部分支援左右滑動原始碼
- 直播小程式原始碼,小程式頁面左右滑動如何解決原始碼
- android開發中如何動態獲取listview中的item的值AndroidView
- web前端仿手機左右滑動(手滑+自動滑動)Web前端
- JavaScript左右拖動滑動的按鈕效果JavaScript
- 短視訊平臺原始碼,Android 左右滑動顯示和隱藏原始碼Android
- RecyclerView 、ViewPager 左右滑動衝突Viewpager
- Android 禁止ViewPager左右滑動AndroidViewpager
- 原始碼解析ListView中的RecycleBin機制原始碼View
- 直播系統app原始碼,自定義中間向兩邊滑動的滑動條APP原始碼
- js左右滑動選項卡效果程式碼例項JS
- Android------Anndroid中ListView在劃屏到底部的時候動態新增ListView的Item實現AndroidView
- ViewPager 禁止左右滑動完美解決Viewpager
- 直播app原始碼,使用者首次登入時彈出左右滑動導航頁APP原始碼
- jQuery滑動方式上下左右滾動效果jQuery
- ListView項(Item)的三種佈局View
- Android動態修改ListView中指定Item的元件屬性AndroidView元件
- 15 個響應式的 jQuery 影象滑塊外掛jQuery
- 微信小程式-能左右滑動的訂單列表微信小程式
- Android 具有左右滑動功能的時間軸Android
- 用ListView簡單實現滑動列表View
- ListView不響應OnItemClickListener的解決方案View
- android 滑動刪除的listview(自定義view)AndroidView
- 直播app開發,滑動式的頂部導航欄(左右橫向滑動)APP
- js內容左右滑動切換的選項卡程式碼例項JS
- flask 原始碼解析:響應Flask原始碼
- 定製gridview使其在listview中當作item使用View
- Flutter ListView 原始碼分析FlutterView原始碼