標籤:
希望得到的效果是ListView不能滾動,可是最大的問題在與ListView Item還必有點擊事件。假設不須要點擊事件那就簡單了,直接設定ListView.setEnable(false);
假設還須要點擊事件。滾動與點擊都是在ListView Touch處理機制管理。
ListView點擊事件是複用ViewGroup的處理邏輯,當使用者點擊視圖而且按下與抬起手指之間移動距離非常小,滿足點擊事件的時間長度限制,就會觸發點擊事件。
ListView滾動事件是自己處理。有兩個推斷條件,當使用者觸發move事件而且滑動超過touch slop距離 或者 滑動速度超過閥值都會判定為滾動事件。
import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ListView;public class ScrollDisabledListView extends ListView { private int mPosition; public ScrollDisabledListView(Context context) { super(context); } public ScrollDisabledListView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollDisabledListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK; if (actionMasked == MotionEvent.ACTION_DOWN) { // 記錄手指按下時的位置 mPosition = pointToPosition((int) ev.getX(), (int) ev.getY()); return super.dispatchTouchEvent(ev); } if (actionMasked == MotionEvent.ACTION_MOVE) { // 最關鍵的地方,忽略MOVE 事件 // ListView onTouch擷取不到MOVE事件所以不會發生滾動處理 return true; } // 手指抬起時 if (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_CANCEL) { // 手指按下與抬起都在同一個視圖內。交給父控制項處理,這是一個點擊事件 if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) { super.dispatchTouchEvent(ev); } else { // 假設手指已經移出按下時的Item,說明是滾動行為,清理Item pressed狀態 setPressed(false); invalidate(); return true; } } return super.dispatchTouchEvent(ev); }}
參考資料:
Disable scrolling in Android ListView
Disable scrolling in listview
轉載請註明出處:
Android 設定ListView不可滾動
http://blog.csdn.net/androiddevelop/article/details/38815493
Android 實現ListView不可滾動效果