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

时间:2010-09-02 19:24:11

标签: android listview

我刚刚开始Android开发,我正在努力获得一个自定义列表视图,其中包含一个复选框。我已经创建了一个扩展 Activity 的基类,创建了一个Adapter并覆盖了getView()方法,将复选框添加到listview中。我假设我需要这样做,因为我需要一些与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 个答案:

答案 0 :(得分:17)

我知道这是一个过时的答案,但我打算写一下,以防其他一些有同样“问题”的人碰到这个页面:

上述问题的解决方案不是问题而只是误解是ListView.onItemSelected()事件在以下情况下被触发:

1)浏览仿真器 - 交叉手柄或 2)就我的HTC-Hero而言,白色小滚球上的滚动动作。

您不必将活动明确扩展到ListActivity。

这是我的小代码,可以从中检索电话号码 列表视图项内的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

            }
        });

我希望这有用......:)

答案 1 :(得分:3)

已经存在一个带复选框的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。这应该有用。

答案 2 :(得分:2)

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

        android:focusable="false"

我认为你不应该使用像android:clickable =“true”这样的属性。

答案 3 :(得分:1)

使用

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

而不是setOnItemSelectedListener

当选择项目未被点击时调用setOnItemSelectedListener以获得被点击的项目你必须使用setOnItemClickListener这将工作

答案 4 :(得分:0)

缺少所选择的侦听器被调用的项目是基于设备所处的模式。在touch mode中,没有焦点也没有选择。您的UI应该使用小部件来区分触摸选择和触摸滚动。例如,当有一个选择选项时,单选按钮就很好。