如何为ListView中的一个项设置OnTouchListener

3

我想从我的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);

            }
        });

我想访问该项的原因是我想在屏幕上拖动它。

是否有更好的方法来实现我的需求?


那也不行,onTouch没有被触发。 - Arif Nadeem
setOnTouchListener 不是触发 onTouchEvent,而只是设置监听器。只有下一次被触摸时,才会调用 OnTouchListener 接口方法。 - idiottiger
你可以试试这个:ListView不要设置setOnItemClickListener,在你的适配器的getView方法中,使用setOnClickListener(...)方法来设置你想接收事件的视图,避免使用setOnTouchListener - idiottiger
你是如何创建列表视图的?我认为你是通过扩展BaseAdapter来创建列表视图的。因此,不要在列表视图上设置监听器,而是在放置在列表视图内部的小部件上设置点击监听器。 - mayur rahatekar
@mirroredAbstraction 我也遇到了同样的问题。你有找到解决方案吗? - Parag Chauhan
显示剩余6条评论
2个回答

2

我处于相同的情况,发现了一些可能有效的方法,但是还没有时间尝试。基本思路是将触摸事件分派给子项,就像您使用getChildAt一样。在listview中监听触摸事件,如果您触摸了感兴趣的视图,则将触摸事件分派给它来处理:

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

我已经测试过这种方法是成功的 - 对于在可滚动视图内滚动,只需将事件分派给子视图(根据您拥有的内容,您可能还需要使用findview来获取不同布局中的适当视图...但这绝对有效。 - Beraxa Ádám

0

我是这样做的

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


        }
    });
}


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接