Listview上的滑动检测不适用于自定义Listview适配器

时间:2014-01-28 14:40:50

标签: java android listview adapter gesture

我实现了一个手势检测器,以找出用户何时会查看我的列表视图(以及当列表的最后一个元素在视图中时),以便我可以向列表中添加更多数据。该列表有我自己构建的自定义适配器。每行中都有一些文本视图和一个图像按钮。我在我的适配器中使用带有单击侦听器的imagebutton(这是一个箭头)来打开与按下的行相关的另一个活动。

管理层希望用户能够点击该行的任何位置以激活它。所以:

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
        {
      View v = convertView;
            final ViewHolder viewHolder;
 .....
          //viewHolder.ibShipmentDetails.setOnClickListener(new OnClickListener()
            v.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View view)
                    {
                    ....  
                    }
         }

但现在,我的投射探测器将无法正常工作。有时候它会做出反应,然后才能正常工作;重启活动,再次无效。

这是我的手势检测器:

class MyGestureDetector extends GestureDetector.SimpleOnGestureListener
        {

  @Override
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {


   if((e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY))
               {


                 if(!loading && ((totalItemCount - visibleItemCount) <= firstVisibleItem))
                    {
                        if(allTabSelected)
                             {
                                  allPageNo++;
                             }
                         else
                             {
                                openPageNo++;
                              }

                        new GetShipmentPreviews().execute(1);
                     }
                } 
         }

在我的活动中:

            gestureDetector = new GestureDetector(this, new MyGestureDetector());
            gestureListener = new View.OnTouchListener() 
                {
                  public boolean onTouch(View v, MotionEvent event) 
                      {                            
                        return gestureDetector.onTouchEvent(event);
                      }
                 };

            listView.setOnTouchListener(gestureListener);

我应该怎么做才能保持v.setOnClickListener和onFling()命令完好无损?

2 个答案:

答案 0 :(得分:1)

您应该使用listViev.setOnItemClickListener()一次,而不是为所有列表项调用v.setOnClickListener()

答案 1 :(得分:1)

从onFling中调出我的MotionEvents为null。这显然是因为事件以某种方式被来自我的自定义适配器的onClickListener“吃掉”。

我从这个答案得到了解决方案:https://stackoverflow.com/a/7159738/1688731

我将以下代码添加到我的Activity类中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
  super.dispatchTouchEvent(ev);
  return gestureScanner.onTouchEvent(ev);
}