【问题标题】:How to setOnTouchListener for an item in a ListView如何为 ListView 中的项目设置 OnTouchListener
【发布时间】:2012-03-14 08:14:02
【问题描述】:

我想从我的 ListView 和 setOnTouchListener 中获取一个项目,以下是我的代码,但我无法正确设置它。

listView.setOnItemClickListener(new OnItemClickListener() {

    public void onItemClick(AdapterView<?> parent, View selectedView,
                    int position, long id) {

            Log.d("ON ITEM CLICK...", " ON ITEM CLICK... "+ position);

            listView.getChildAt(position).setOnTouchListener(HorizontalListActivity.this);

            ViewHolder viewHolder =(ViewHolder)selectedView.getTag();

            viewHolder.ivThumbnail.setOnTouchListener(HorizontalListActivity.this);

            }
        });

我想访问该项目的原因是我想将它拖到屏幕上。

有没有更好的方法来做我想做的事?

【问题讨论】:

  • 尝试将 listView.getChildAt(position).setOnTouchListener 更改为 selectedView.setOnTouchListener 或在 getView 方法中,当初始化 ivThumbnail 时,使用 setOnTouchListener
  • 那也不起作用,onTouch 没有被触发
  • setOnTouchListener不是触发onTouch事件,只是设置监听器,只有下次触发时,才会调用OnTouchListner接口方法。
  • 我摸了两次,还是不行..
  • 我以前遇到过触摸事件的问题,问题是父视图正在窃取它们,因此孩子从未看到它们。因此,在您的情况下,ListView 正在窃取触摸事件,因此ListView 元素永远不会得到它们。不幸的是,我对如何修复它没有任何建议。

标签: android android-listview android-view


【解决方案1】:

我也遇到了同样的情况,并且发现了一些可行的方法,但我还没有时间尝试。基本思想是像您所做的那样,使用 getChildAt 将触摸事件分派给孩子。你在列表视图中监听触摸事件,如果你触摸了你感兴趣的视图,就将触摸事件分派给它来处理它:

 MyControl control = ListViews.getChildAt(position));
 control.onTouchEvent(touchEvent);

【讨论】:

  • 我已经测试过这种成功的方法 - 为了在可滚动视图中滚动,只需将事件分派给孩子(您可能还需要使用 findview 在不同布局中获取适当的视图,具体取决于你有......但这绝对有效。
【解决方案2】:

我就是这样做的

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View selectedView,
                                int position, long id) {

            selectedView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            x1 = event.getX();
                            break;
                        case MotionEvent.ACTION_UP:
                            x2 = event.getX();
                            float deltaX = x2 - x1;
                            if (Math.abs(deltaX) > MIN_DISTANCE) {
                                if (x2 > x1) {
                                    Toast.makeText(PlayerList.this,"left to right",Toast.LENGTH_SHORT).show();

                                }
                                else {
                                    Toast.makeText(PlayerList.this,"right to left",Toast.LENGTH_SHORT).show();
                                }
                            } else {
                                // consider as something else - a screen tap for example
                            }
                            break;
                    }
                    return true;
                }
            });


        }
    });
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多