我实现了一个手势检测器,以找出用户何时会查看我的列表视图(以及当列表的最后一个元素在视图中时),以便我可以向列表中添加更多数据。该列表有我自己构建的自定义适配器。每行中都有一些文本视图和一个图像按钮。我在我的适配器中使用带有单击侦听器的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()命令完好无损?
答案 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);
}