【问题标题】:Showing a delete button on swipe in a listview for Android在 Android 的列表视图中滑动时显示删除按钮
【发布时间】:2026-01-20 13:20:08
【问题描述】:

扩展另一个 * 问题,我已经实现了一些手势检测代码,以便我可以检测我的列表视图(在 FrameLayout 中)中的一行何时被刷过。我在这里关注了 Damian 的问题/答案,关于如何从适配器获取单个行/视图。 How to get location (on screen) of row in listview

我的 onFling 中有获取行视图的代码,并尝试将在我的 xml 布局中设置为不可见的删除按钮设置为可见。然而,这不会发生。我想知道如何在滑动时使按钮在列表视图中可见?

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        try {

            if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                int itemId = MyClass.this.lv.pointToPosition(
                        (int) e1.getX(), (int) e1.getY());

                Log.v("item id", String.valueOf(itemId));
                View v = MyClass.this.adapter
                        .getViewOnScreen(itemId);
                Button delete = (Button) v.findViewById(R.id.button_delete);

                delete.setVisibility(View.VISIBLE);
                //MyClass.this.adapter.notifyDataSetChanged();


            }

        } catch (Exception e) {
            // nothing
        }
        return false;
    }
}

我的列表适配器代码与引用的问题相同。

编辑:我尝试在 listview 上使用 getChildAt() 来获取行的视图,当有一个或更少的项目时,这有效,但是当返回的视图超过错误的视图时,错误的删除按钮变为可见。

编辑 2:我使用问题的答案 here 让它工作:

【问题讨论】:

    标签: android listview onfling


    【解决方案1】:

    我曾经在我的应用中实现过类似的功能。我的做法:

    public class MyGestureDetector extends SimpleOnGestureListener {
        private ListView list;
    
        public MyGestureDetector(ListView list) {
            this.list = list;
        }
    
        //CONDITIONS ARE TYPICALLY VELOCITY OR DISTANCE    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (INSERT_CONDITIONS_HERE)
                if (showDeleteButton(e1))
                    return true;
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    
        private boolean showDeleteButton(MotionEvent e1) {
            int pos = list.pointToPosition((int)e1.getX(), (int)e1.getY());
            return showDeleteButton(pos);
        }
    
        private boolean showDeleteButton(int pos) {
            View child = list.getChildAt(pos);
            if (child != null){
                Button delete = (Button) child.findViewById(R.id.delete_button_id);
                if (delete != null)
                    if (delete.getVisibility() == View.INVISIBLE)
                        delete.setVisibility(View.VISIBLE);
                    else
                        delete.setVisibility(View.INVISIBLE);
                return true;
            }
            return false;
        }
    }
    

    这对我有用,希望你能让它工作,或者它至少给你一些提示。

    【讨论】:

    • 嗨,在片段中使用相同的代码,但我在 onFling 方法中的 e1 处得到 null。你能帮帮我吗?
    • @GangadharNimbally 您可能应该在放置完整堆栈跟踪和代码的位置开始您自己的问题。
    • 我已经实现了上面的类,但是有些对我不起作用。新的 MyGestureDetector(lst_sampleList);
    • 就像我说的,@HiteshDhamshaniya,您可能应该开始自己的问题,在那里您可以放置​​完整的堆栈跟踪和您的代码。
    • @Heskja 该代码对我有用。但是我应该在INSERT_CONDITIONS_HERE 上设置什么类型的条件?
    最近更新 更多