Java 在ListView(Android)上使用OnTouchListener时崩溃
我在尝试用列表视图测试多点触摸时,在Android 3.2中遇到了一个崩溃。我可以用一个只包含一个ListView和不到20行Java代码的简单布局重现这个异常。任何人对此事的建议都将不胜感激 我想做什么: 我希望用户能够通过拖动来检查ListView上的许多项目,而不妨碍滚动ListView,因此我认为用户将使用一个手指滚动ListView,然后用两个手指单击并拖动以选择他们移动的项目。当然,我决定为我的ListView设置一个onTouchListener,以便处理多点触控事件 问题: 用一个手指滚动效果很好。但当我用两个手指触摸然后抬起时,我的应用程序(有时)立即崩溃。有时意味着大约70%的时间,这让我相信这与从2个手指变为0个手指有关。崩溃甚至不在我拥有的任何代码中,而是在ListView本身()调用的MotionEvent中的本机方法中 代码: 下面是我为了引起问题而写的内容 MainActivity.javaJava 在ListView(Android)上使用OnTouchListener时崩溃,java,android,listview,multi-touch,ontouchlistener,Java,Android,Listview,Multi Touch,Ontouchlistener,我在尝试用列表视图测试多点触摸时,在Android 3.2中遇到了一个崩溃。我可以用一个只包含一个ListView和不到20行Java代码的简单布局重现这个异常。任何人对此事的建议都将不胜感激 我想做什么: 我希望用户能够通过拖动来检查ListView上的许多项目,而不妨碍滚动ListView,因此我认为用户将使用一个手指滚动ListView,然后用两个手指单击并拖动以选择他们移动的项目。当然,我决定为我的ListView设置一个onTouchListener,以便处理多点触控事件 问题: 用一
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = ((ListView) findViewById(R.id.listView1));
String[] list = new String[]{"a", "b", "c", "d", "e", "f", "g"};
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
lv.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getPointerCount() != 2) {
return false;
}
return true;
}
});
}
}
公共类MainActivity扩展活动{
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=((ListView)findViewById(R.id.listView1));
字符串[]列表=新字符串[]{“a”、“b”、“c”、“d”、“e”、“f”、“g”};
lv.setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,list));
lv.setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
if(event.getPointerCount()!=2){
返回false;
}
返回true;
}
});
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</RelativeLayout>
就这样。我在运行Android 3.2.1的Thrive上运行我的程序,我的项目目标是API级别13(3.2)。我没有其他平板电脑来测试它,也不能使用我的普通开发虚拟机,因为没有多点触控支持
如果调用getter并返回false或true,不管值是多少,它都不会崩溃。我认为这与以下事实有关:当我触摸时,ListView会得到一个click事件,然后当调用我的侦听器时,它会开始使用任何包含两个手指的事件。然后,当我同时抬起两个手指时,ListView中没有任何事件表明它已完成,因此它仍然希望能够找到所选项目的指针索引
所以我的问题是“我写的东西打破了ListView的某种契约吗?”我应该以其他方式进行测试吗
另外,如果有人能告诉我API级别13的源代码,我将非常感激。它无法通过Android SDK管理器访问(只有14-16个),如果我有它,我很可能能够理解问题的根源。检查这一点:这与他们实际编写的代码有关。在我提供的堆栈跟踪中,它显示崩溃不是由我的代码直接导致的(我的包是com.ksoft.sandbox)。