私のアプリケーションには、ListView 用の Touchlistener があります。TouchListener を使用すると、タッチ イベントから X 座標と Y 座標を取得できます。ここで、クリックされた項目を ListView から取得したいと考えています。onTouchListener のみを使用して listView 内のクリック項目の位置を取得するにはどうすればよいですか? onItemClickedListener を使用したくありません。
4 に答える
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;
}
SwipeListView ジェイク ウォートンから取得します
を使用することが必須でない場合はTouchListener
、 を使用することを強くお勧めしますOnItemClickListener
。それはあなたの人生を大幅に簡素化します。
それ以外に、現在のオフセットとスクロール位置、ListView
各行の高さを取得し、計算を行って点 (x,y) が各行のポリゴンにあるかどうかを判断する必要があります。行は四角形であるため、数学はそれほど難しくありませんが、使用OnItemClickListener
するのははるかに簡単です。
さらに、 を使用する必要がある場合は、 を使用して、最後にクリックされた項目を示す値をクラス (または別の場所)に設定するTouchListener
こともできます。次に、その値を確認し、それを使用して (x,y) 座標とアイテムを関連付けることができます。もちろん、これは最初に実行されるものに依存します。逆が真の場合、それを機能させることができますが、代わりに を使用してタッチ位置を保存し、で関連付けます。OnItemClickListener
Adapter
TouchListener
ListView
OnItemClickListener
TouchListener
OnItemClickListener
クラスは両方を実装できます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.
}