安卓自定义列表视图,setOnItemSelectedListener不起作用

10

我刚开始学习Android开发,正在尝试实现一个带有复选框的自定义列表视图。我创建了一个继承自Activity的基础类,创建了一个适配器并重写了getView()方法来将复选框添加到列表视图中。我认为这样做是因为我需要类似于Obj C中的didSelectRowIndexAtPath来更新我的模型。如果还有其他方法,请让我知道!

现在,在我的基础类中,我有以下代码 -

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout);
    setContentView(R.layout.facilityscreen);

    /* Static Data source */
    facilityModel = new FacilityDataModel[2];

    facilityModel[0] = new FacilityDataModel();
    facilityModel[1] = new FacilityDataModel();


    facilityModel[0].setFacilityName("Test 1");
    facilityModel[0].setFacilityID("Facid0001");
    facilityModel[0].setChecked(false);


    facilityModel[1].setFacilityName("Test 2");
    facilityModel[1].setFacilityID("Facid0002");
    facilityModel[1].setChecked(true);


    facilityListView = (ListView) findViewById(R.id.facilityListView);

    FacilityScreenAdapter adapter = new FacilityScreenAdapter(this, facilityModel);

    facilityListView.setAdapter(adapter);    

    myPatBtn = (Button) findViewById(R.id.myPatBtn);
    myPatBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            int i=0;
            i++;
        }});

    facilityListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int i=0;
            i++;

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });

}    

我的问题是setOnItemSelectedListener根本没有被调用。我已经苦苦挣扎了几个小时,但我无法弄清楚为什么它根本没有被调用。

非常感谢您的任何帮助!

谢谢,
Teja。

5个回答

18

虽然我知道这是一个过时的答案,但我还是要写一下,以防其他遇到相同“问题”的人也会进入这个页面:

以上所述“问题”的解决方案并不是问题,而只是一种误解,即ListView.onItemSelected()事件会在以下情况下触发:

1)通过模拟器交叉处理或2)就像我的HTC-Hero一样,在白色小滚轮上进行滚动操作。

您不必将您的活动显式地扩展到ListActivity。

这是我简单的代码,它从listview项中的TextView控件检索电话号码。当用户触摸列表项或使用小滚轮滚动列表时,会激发以下事件,并调用MakeACall()方法:

myList.setOnItemClickListener(new OnItemClickListener() 
        {
            public void onItemClick(AdapterView<?> parent, View view, int position, long i) 
            {
                TextView myPhone = (TextView)view.findViewById(R.id.txtphone);
                MakeACall(myPhone.getText().toString());        
            }
        });

        myList.setOnItemSelectedListener(new OnItemSelectedListener() 
        {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long i) 
            {
                TextView myPhone = (TextView)view.findViewById(R.id.txtphone);
                MakeACall(myPhone.getText().toString());
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });

我希望那对你有所帮助... :)


4
已经存在一种ListView带有复选框的可能性。
public class List11 extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice, GENRES));

        final ListView listView = getListView();

        listView.setItemsCanFocus(false);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }


    private static final String[] GENRES = new String[] {
        "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
        "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
    };
}

我从APIDemos中选择了这个示例,因为它是最简单的。然后,您可以使用以下方法获取所选项目:

long[] selectedIds = getListView().getCheckItemIds();

您可能也会对内部在列表中使用的CheckedTextView感兴趣。
针对onListItemClick问题的部分,请尝试从ListActivity扩展而不是Activity。接着重写onListItemClick方法。这样应该可以解决问题。

谢谢!那真的为我省了很多麻烦。但是我接下来要实现的下一个ListView需要我自定义它,所以我仍然需要在onClickListner()上得到帮助。 - Tejaswi Yerukalapudi

4

使用

setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// here you code 
}
})

使用setOnItemClickListener代替setOnItemSelectedListener

因为setOnItemSelectedListener是在选中项目而不是单击时被调用,所以要获取单击的项目,必须使用setOnItemClickListener,这将起作用。


2

您应该将自定义列表布局中的所有可聚焦项设置为false:

        android:focusable="false"

我认为您不应该为它们使用像android:clickable="true"这样的属性。

0
所选项目监听器未被调用的缺失是有意设计的,这取决于设备处于哪种模式。在触摸模式下,没有焦点和选择。您的用户界面应该使用区分选择触摸和滚动触摸的小部件。例如,单选按钮非常适合只有一个选择项的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接