Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Android 安卓&x27;s的ListView不在单击时侦听_Android_Listview - Fatal编程技术网

Android 安卓&x27;s的ListView不在单击时侦听

Android 安卓&x27;s的ListView不在单击时侦听,android,listview,Android,Listview,我正在Android上开发一个简单的应用程序,其中一些项目显示在列表上。用户可以单击其中一个,将其带到进一步的活动。基础知识 但是我的听众没有被呼叫!我已经找到了,但解决方案(不允许列表项视图获得焦点)对我不起作用。然而,长时间的点击会被捕获——我的OnItemLongClickListener会被调用。请看一下下面的代码,然后自己试试。这是我的代码的简化版本,显示了错误行为。顺便说一句:我正在使用AndriodSDK2.0和Eclipse3.5.1 package de.sacherkhoud

我正在Android上开发一个简单的应用程序,其中一些项目显示在列表上。用户可以单击其中一个,将其带到进一步的活动。基础知识

但是我的听众没有被呼叫!我已经找到了,但解决方案(不允许列表项视图获得焦点)对我不起作用。然而,长时间的点击会被捕获——我的OnItemLongClickListener会被调用。请看一下下面的代码,然后自己试试。这是我的代码的简化版本,显示了错误行为。顺便说一句:我正在使用AndriodSDK2.0和Eclipse3.5.1

package de.sacherkhoudari.listtest;

import java.util.LinkedList;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class ListTest extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final List<ListEntry> lEntries = new LinkedList<ListEntry>();
        for ( int ii = 0; ii < 10; ii++ )
            lEntries.add( new ListEntry( "Entry " + ii ) );

        setListAdapter( new ArrayAdapter<ListEntry>( this, R.layout.list_item, lEntries ) );

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener( new OnItemClickListener() {
            public void onItemClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
            }
        });

        lv.setOnItemLongClickListener( new OnItemLongClickListener() {
            public boolean onItemLongClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemLongClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
                return false;
            }
        });

        setContentView(lv);
    }
}

class ListEntry {
    private String name;

    public ListEntry( String s ) {
        name = s;
    }

    public String toString() {
        return name;
    }
}
package de.sacherkhoudari.listtest;
导入java.util.LinkedList;
导入java.util.List;
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.AdapterView.OnItemLongClickListener;
公共类ListTest扩展ListActivity{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最终列表lentrys=newlinkedlist();
对于(int ii=0;ii<10;ii++)
添加(新列表(“条目”+ii));
setListAdapter(新的ArrayAdapter(this,R.layout.list_项,lentrys));
ListView lv=getListView();
lv.setTextFilterEnabled(真);
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Toast.makeText(ListTest.this,“ItemClick at item”+lentrys.get(position).toString(),Toast.LENGTH_LONG.show();
}
});
lv.setOnItemLongClickListener(新的OnItemLongClickListener(){
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
Toast.makeText(ListTest.this,“ItemLongClick at item”+lentrys.get(position).toString(),Toast.LENGTH_LONG.show();
返回false;
}
});
setContentView(lv);
}
}
课堂旁听{
私有字符串名称;
公共ListEntry(字符串s){
name=s;
}
公共字符串toString(){
返回名称;
}
}
到目前为止,Java代码。。。下面是布局列表_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp"
    android:focusable="false" >
</TextView>

注意:
android:focusable=“false”
无效

谢谢

Sacher

移动
设置内容视图(lv)在检索ListView之后

ListView lv = getListView();
setContentView(lv);
lv.setTextFilterEnabled(true);

使用setContentView添加布局时,该布局中的视图将新实例化。ListActivity默认情况下有一个非常简单的布局(请阅读),即使您没有添加自己的布局。基本上,在第一个示例中:

  • 首先,将侦听器添加到ListActivity中的默认ListView
  • 然后使用setContentView将新布局与新ListView实例化,从而丢弃该ListView
  • 然后,您永远不会从新布局向新ListView注册新的侦听器

然而,当您在代码中向上拉setContentView时,您只能使用自己的ListView,并且一切都按预期工作。

太好了,成功了!谢谢但是为什么呢?在添加侦听器之前,当我调用
setContentView()
时会发生什么变化?TBH,我不知道。我猜事件与活动相关,而不是视图本身(这只是猜测)-如果您认为答案正确,请接受答案显然上述评论不正确-来自,“事件侦听器是视图类中包含单个回调方法的接口。当用户与UI中的项目交互触发侦听器已注册的视图时,Android框架将调用这些方法。“-仍在寻找答案可能。。。但是很奇怪。。。在OOP中,如果您先注册一个对象,然后更改它的状态,或者先设置它的状态,然后将它的引用传递给您的框架,那么应该没有什么区别。。。但无论如何,谢谢你的回答。当然,您可以接受它:)因为您可以将XML布局传递给setContentView,onCreate将膨胀它并将UI添加到视图层次结构中。也许在关联任何事件之前设置视图对于普通工作流更好(请参见不同的setContentView签名),同样这只是我的解释:)有趣-我不明白的是,如果setContentView创建新实例(在第一个示例中),ListView为什么会显示列表项?它不应该是一个空列表吗?来自文档“ListActivity承载一个可以绑定到不同数据源的ListView对象”。由于setAdapter是在(这个)上调用的,所以当它被实例化时,我想这就是为什么要保留项的原因。谢谢您的解释!这是一般规则吗?我是否必须首先通过
setContentView()
实例化视图,然后设置所有侦听器和其他设置?我在官方文件中找不到这方面的任何信息。你知道还有其他资源吗?还有其他陷阱吗?是的,这是在正常活动上使用布局并重新启动活动时的一般规则。您可以自己尝试:如果在onCreate()中设置视图之前调用findViewById,您将得到一个空引用。例外情况是带有预实例化视图的类似ListActivity的活动。findviewbydjavadoc()谈到“在onCreate(Bundle)中处理的XML”,imho只能指onCreate中的setContentView()。