找出ListView中的哪个item被刷了
Find out which item in ListView was swiped
我正在尝试在我的 ListView 中滑动一行,识别其文本并执行某些操作。我能够检测到 left/right 滑动,但如何识别滑动行的文本?与使用位置变量的 onItemClickListener 不同,我无法识别它的位置。
主要活动Class
ListView orderListView;
ArrayList<String> orders;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_stock);
orderListView = (ListView)findViewById(R.id.orderListView);
orders = new ArrayList<>();
orders.add("order 1");
orders.add("order 2");
orders.add("order 3");
adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, orders);
orderListView.setAdapter(adapter);
OnSwipeTouchListener onSwipeTouchListener = new OnSwipeTouchListener(this, orderListView);
orderListView.setOnTouchListener(onSwipeTouchListener);
}
OnSwipeTouchListener Class
public class OnSwipeTouchListener implements View.OnTouchListener {
ListView list;
private GestureDetector gestureDetector;
private Context context;
public OnSwipeTouchListener(Context ctx, ListView list) {
gestureDetector = new GestureDetector(ctx, new GestureListener());
context = ctx;
this.list = list;
}
public OnSwipeTouchListener() {
super();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void onSwipeRight(int pos) {
Log.i("zxR", "right");
}
public void onSwipeLeft() {
Log.i("zxL", "left");
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
private int getPostion(MotionEvent e1) {
return list.pointToPosition((int) e1.getX(), (int) e1.getY());
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight(getPostion(e1));
else
onSwipeLeft();
return true;
}
return false;
}
}
}
使用新的 RecyclerView 而不是 ListView,因为它具有简单的 api 手势和动画。
RecyclerView 同样的问题:
试试这个,我认为这可能有帮助:
在 OnSwipeTouchListener 的构造函数的参数中包含 ArrayAdapter 并从 main activity
传递 ListView 的适配器
然后将此代码添加到您的 onFling()
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
String text=adapter.getItem(id);
Toast.makeText(context,"Text:"+text,Toast.LENGTH_SHORT).show();
我正在尝试在我的 ListView 中滑动一行,识别其文本并执行某些操作。我能够检测到 left/right 滑动,但如何识别滑动行的文本?与使用位置变量的 onItemClickListener 不同,我无法识别它的位置。
主要活动Class
ListView orderListView;
ArrayList<String> orders;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_stock);
orderListView = (ListView)findViewById(R.id.orderListView);
orders = new ArrayList<>();
orders.add("order 1");
orders.add("order 2");
orders.add("order 3");
adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, orders);
orderListView.setAdapter(adapter);
OnSwipeTouchListener onSwipeTouchListener = new OnSwipeTouchListener(this, orderListView);
orderListView.setOnTouchListener(onSwipeTouchListener);
}
OnSwipeTouchListener Class
public class OnSwipeTouchListener implements View.OnTouchListener {
ListView list;
private GestureDetector gestureDetector;
private Context context;
public OnSwipeTouchListener(Context ctx, ListView list) {
gestureDetector = new GestureDetector(ctx, new GestureListener());
context = ctx;
this.list = list;
}
public OnSwipeTouchListener() {
super();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void onSwipeRight(int pos) {
Log.i("zxR", "right");
}
public void onSwipeLeft() {
Log.i("zxL", "left");
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
private int getPostion(MotionEvent e1) {
return list.pointToPosition((int) e1.getX(), (int) e1.getY());
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight(getPostion(e1));
else
onSwipeLeft();
return true;
}
return false;
}
}
}
使用新的 RecyclerView 而不是 ListView,因为它具有简单的 api 手势和动画。
RecyclerView 同样的问题:
试试这个,我认为这可能有帮助: 在 OnSwipeTouchListener 的构造函数的参数中包含 ArrayAdapter 并从 main activity
传递 ListView 的适配器然后将此代码添加到您的 onFling()
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
String text=adapter.getItem(id);
Toast.makeText(context,"Text:"+text,Toast.LENGTH_SHORT).show();