在Android列表视图中滑动时显示删除按钮

扩展到另一个Stackoverflow问题,我已经实现了一些手势检测代码,以便我可以检测我的listview中的行(在FrameLayout中)是否被刷过。 我跟着Damian的问题/答案,关于如何从适配器获取单独的行/视图。 如何在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; } } 

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

编辑:我尝试在列表视图上使用getChildAt()来获取行的视图,当有一个或更少的项目时,这可以工作,但是当返回的错误视图超出错误时,会显示错误的删除按钮。

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

我曾经在我的应用程序中实现了类似的function。 我这样做的方式:

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

这对我有用,希望你能让它发挥作用,或者它至少会给你一些暗示。