2012-10-03 40 views
6

在另一个Stackoverflow问题上展开,我已经实现了一些手势检测代码,这样我就可以检测到我的ListView中的一行(在FrameLayout中)已被刷过。我在这里跟踪了Damian的问题/回答,以了解如何从适配器获取单个行/视图。 How to get location (on screen) of row in listview在Android的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:我以前对这个问题here答案得到它的工作:

回答

9

我实现了这样的事情在我的应用程序一次。我这样做的方式:

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

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

+0

嗨在片段中使用相同的代码,但是iam在onFling方法中在e1处获得null。你能帮我么 ? –

+1

@GangadharNimbally你应该开始你自己的问题,你把完整的stacktrace和你的代码。 – Heskja

+0

我已经实现了上面的类,但有些如何不适合我。新的MyGestureDetector(lst_sampleList); –