【问题标题】:OnSwipeListener and ExpandableListView click not recognizedOnSwipeListener 和 ExpandableListView 点击无法识别
【发布时间】:2015-01-26 08:32:49
【问题描述】:

我在识别可展开列表视图上的 onGroup 点击时遇到问题。我正在为我的组视图使用自定义滑动侦听器以实现滑动目的。现在我想要的只是在按下组的同时展开组,似乎我找不到在组视图上注册 OnTouch 和 onGroupClick 的正确方法。当我不滑动时,我调用 false 以便可以识别其他手势(例如正常点击和长按),但我的组没有响应点击,因此没有扩展。

现在我的 Swipe 监听器工作正常,但 OnGroupClick 没有被调用,也没有扩展。当我从 getGroupView() 方法中删除 OnSwipeListener 时,实际的扩展工作正常。

我对滑动监听器的自定义:

public class OnSwipeListener implements View.OnTouchListener
{
    private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());

    public boolean onTouch(final View v, final MotionEvent event)
    {
        return gestureDetector.onTouchEvent(event);
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener
    {

        private static final int SWIPE_THRESHOLD = 70;
        private static final int SWIPE_VELOCITY_THRESHOLD = 70;

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
        {
            boolean result = false;
            try
            {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY))
                {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD)
                    {
                        if (diffX > 0)
                        {
                            result = onSwipeRight();
                        }
                        else
                        {
                            result = onSwipeLeft();
                        }
                    }
                }
                else
                {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD)
                    {
                        if (diffY > 0)
                        {
                            result = onSwipeBottom();
                        }
                        else
                        {
                            result = onSwipeTop();
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public boolean onSwipeRight()
    {
        return false;
    }

    public boolean onSwipeLeft()
    {
        return false;
    }

    public boolean onSwipeTop()
    {
        return false;
    }

    public boolean onSwipeBottom()
    {
        return false;
    }
}

我的可展开列表视图及其组点击监听器设置:

expandable_list_view = (ExpandableListView) findViewById(R.id.activity_profile_expandable_listview);
setGroupParents(); setChildData();
ExpandableListAdapter adapter = new ExpandableListAdapter(this, parentItems, childItems);
expandable_list_view.setAdapter(adapter);

expandable_list_view.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener()
{
    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id)
    {
        parent.smoothScrollToPosition(groupPosition);

        if (parent.isGroupExpanded(groupPosition))
        {
            parent.collapseGroup(groupPosition);
        } else {
            parent.expandGroup(groupPosition);
        }

        return false;
    }
});

最后从我的自定义适配器中获取可扩展列表视图的 getGroupView:

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{

if (convertView == null)
{
    convertView = inflater.inflate(R.layout.layout_activity_expandableitem, null);
}

final View converted_view = convertView;

final LinearLayout front_view = (LinearLayout) converted_view.findViewById(R.id.layout_activity_expandableitem_front_view); front_view.setTag(Position.CENTER);
final LinearLayout behind_view = (LinearLayout) converted_view.findViewById(R.id.layout_activity_expandableitem_behind_view);
final View confirmation_view = inflater.inflate(R.layout.slide_profile, null); confirmation_view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
final View cancel_view = inflater.inflate(R.layout.slide_cancel, null); cancel_view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));


//  Set onTouchListener
front_view.setOnClickListener(null);
front_view.setOnTouchListener(new OnSwipeListener()
{
    @Override
    public boolean onSwipeRight()
    {
        Position position = (Position) front_view.getTag();
        if (position == Position.CENTER)
        {
            behind_view.removeAllViews();
            behind_view.addView(confirmation_view);
            showConfirmation(front_view);

            front_view.setTag(Position.RIGHT);
        }
        else if (position == Position.LEFT)
        {
            //behind_view.removeAllViews();
            showCenter(front_view, Position.RIGHT);

            front_view.setTag(Position.CENTER);
        }

        return true;
    }

    @Override
    public boolean onSwipeLeft()
    {
        Position position = (Position) front_view.getTag();
        if (position == Position.CENTER)
        {
            behind_view.removeAllViews();
            behind_view.addView(cancel_view);
            showInfo(front_view);

            front_view.setTag(Position.LEFT);
        }
        else if (position == Position.RIGHT)
        {
            //behind_view.removeAllViews();
            showCenter(front_view, Position.LEFT);

            front_view.setTag(Position.CENTER);
        }

        return true;
    }
});

//  Return the view
return converted_view;

感谢您提供有关如何解决此问题的任何想法。

【问题讨论】:

    标签: android view expandablelistview gestures


    【解决方案1】:

    所以这是怎么回事:

    1. 当您设置OnGroupClick 时,它被设置为whole listview不是 每行)listview 的实现将“找出”哪个触摸listView 时单击了行
    2. 设置 SwipeListener 后,将其附加到
    3. 当两者都设置时,行在整个listview 之前,并将处理(使用)触摸事件,而触摸事件又不会到达列表视图(这就是为什么你让它们分开工作的原因)。

    您可以选择:

    1. 子类ListView 并实现onInterceptTouchEvent()。这样,您的listview 将始终能够“看到”触摸事件并对其采取行动。 (请注意,您可能会遇到同时检测到滑动和点击的情况。
    2. 实现您自己的ListView,其OnTouch 将负责识别哪一行有交互、识别滑动手势(通过您的侦听器)和点击事件,并决定哪些是先例。

    【讨论】:

    • 感谢您的清晰解释和解决方案。这正是我所需要的,谢谢先生!
    【解决方案2】:

    您可以尝试我自己实现的following 解决方案,并确保它有效。我使用了onClickListener 而不是SwipeListener。希望它可以帮助您解决问题。

    【讨论】:

    • 这并不能解决我的问题。我的问题是在可扩展列表视图上同时注册触摸(来自 SwipeListener)和点击事件。
    • 我在这里无法理解的是为什么您需要在您的商业计划中使用 swipeListener。我不确定可扩展列表视图是否支持滑动。它通常使用点击来打开/关闭父元素的子元素。
    • Android SDK 中的每个视图都支持触摸事件,因此我编写了 Swipe 监听器并将其与 onClick 监听器一起添加到列表视图中。我需要滑动侦听器,以便用户可以向左|向右拖动视图。我需要做的只是一个列表视图(可扩展的列表视图),我可以扩展它并使用滑动手势来进一步开发。希望对您有所帮助。
    • 好的,你可以试试这个:stackoverflow.com/questions/18857452/…
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2011-10-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多