Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ListView(Android)上使用OnTouchListener时崩溃_Java_Android_Listview_Multi Touch_Ontouchlistener - Fatal编程技术网

Java 在ListView(Android)上使用OnTouchListener时崩溃

Java 在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,以便处理多点触控事件 问题: 用一

我在尝试用列表视图测试多点触摸时,在Android 3.2中遇到了一个崩溃。我可以用一个只包含一个ListView和不到20行Java代码的简单布局重现这个异常。任何人对此事的建议都将不胜感激

我想做什么:

我希望用户能够通过拖动来检查ListView上的许多项目,而不妨碍滚动ListView,因此我认为用户将使用一个手指滚动ListView,然后用两个手指单击并拖动以选择他们移动的项目。当然,我决定为我的ListView设置一个onTouchListener,以便处理多点触控事件

问题: 用一个手指滚动效果很好。但当我用两个手指触摸然后抬起时,我的应用程序(有时)立即崩溃。有时意味着大约70%的时间,这让我相信这与从2个手指变为0个手指有关。崩溃甚至不在我拥有的任何代码中,而是在ListView本身()调用的MotionEvent中的本机方法中

代码: 下面是我为了引起问题而写的内容

MainActivity.java

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)。