我试图为ListView实现类似于“拖放”的东西。任务很简单。我有一个“侧菜单”,我在列表中放置了一些对象。它们都展示在那里。我想要的是把其中一个拖到屏幕上。
我首先尝试使用OnTouchListener,它为我提供了我想要的拖放功能。所以我做了一件事
@Override
public boolean onTouch(View view, MotionEvent movEv) {
if (movEv.getAction() == MotionEvent.ACTION_DOWN)
// DRAG
else if (movEv.getAction() == MotionEvent.ACTION_UP)
// DROP
return false;
}重点是,这只给了我MotionEvent的信息,比如X和Y位置。我需要的是知道哪个项目被点击了。有点像OnItemClickListener
问题是,只有当我“单击”一个项目时,OnItemClickListener才能工作,这意味着我没有移动手指。当我移动并释放它的时候,侦听器就不再认为这是单击了。因此使用
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// I know which item was pressed -> position
}不起作用。
有人知道怎么解决这个问题吗?我可以在“onItemClick”时刻使用onPressed吗?
谢谢你的帮助!
发布于 2014-10-25 14:40:23
而不是OnItemClickListener,您可以在OnTouchListener中使用pointToPosition方法。它可以是这样的:
@Override
public boolean onTouch(View view, MotionEvent movEv) {
if (movEv.getAction() == MotionEvent.ACTION_DOWN) {
int itemPosition = listView.pointToPositon(movEv.getX(), movEv.getY());
// DRAG
}
else if (movEv.getAction() == MotionEvent.ACTION_UP)
// DROP
return false;
}发布于 2014-10-25 14:48:43
一种解决方案是为适配器中的每一项注册一个触摸侦听器,并保存它的位置,以便它在侦听器中可用。
下面是一个例子:
private class MyAdapter extends ArrayAdapter<String> implements View.OnTouchListener {
public MyAdapter(Context context, int resource) {
super(context, resource);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
v.setOnTouchListener(this);
v.setTag(position);
return v;
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Integer position = (Integer) view.getTag();
// Do something with item at "position"
return false;
}
}https://stackoverflow.com/questions/26563141
复制相似问题