Android - 使用onItemClick和onTouch的ListView

时间:2014-10-25 13:52:56

标签: android drag-and-drop click

我尝试为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;
}

关键是,这简单地给了我关于X和Y位置的MotionEvent的信息。 我需要的是知道WHICH项目被点击了。像 OnItemClickListener

这样的东西

问题是,OnItemClickListener只有在我点击某个项目时才有效,这意味着我不会移动手指。我移动并释放它的那一刻,监听器不再认为这是一次点击。因此使用

 @Override
 public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
   // I know which item was pressed -> position
 }

不起作用。

有谁知道如何解决这个问题?我可以在“onPressed”时刻以某种方式使用onItemClick吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在OnTouchListener中使用pointToPosition方法而不是OnItemClickListener。它可以是这样的:

@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;
}

答案 1 :(得分:1)

一种解决方案是为适配器中的每个项目注册一个触摸侦听器并保存它的位置,以便它在侦听器中可用。

以下是一个例子:

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;
    }
}