OnItemClick 侦听器在异步填充列表中选择多行 android

OnItemClick listener selects multiple rows in async filled list android

我有一个列表,里面全是联系人。我使用异步 class.

加载列表中的联系人

在列表 class 中,我实现了 setOnItemClickListener。在这个 setOnItemClickListener 中,我将选定的联系人放在一个数组中,这样我就可以向他们发送文本。这一切都像在做梦。

但是有一个小问题。在列表中选择一个联系人时,会选择多个联系人,如下所示:

-normal contact-
-selected contact-
-normal contact-
-normal contact-
-normal contact-
-normal contact-
-selected contact-

我使用此代码加载联系人:

    @Override
    protected void onPostExecute(ArrayList<list_item_person> contacts) {
        // TODO Auto-generated method stub
        super.onPostExecute(contacts);

        pd.cancel();




        PersonListAdapter adapter =  new PersonListAdapter(getActivity().getApplicationContext(),
                R.layout.list_item_person, contacts);

        list.setAdapter(adapter);

    }

这是异步 class

onclick 是这样的:

 list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

            list_item_person o = (list_item_person) list.getItemAtPosition(position);
          SearchResults selected = new SearchResults("");
            int i = 0;
            for( SearchResults number:contact_selected){
                if(o.phoneNumber.equals(number.getPhoneNumber())){
                    i ++;
                    selected = number;
                }
            };
            if(i == 0) {
                contact_selected.add(new SearchResults(String.valueOf(o.phoneNumber)));
                arg1.setBackgroundColor(Color.RED);
                Log.e("e", String.valueOf(o.phoneNumber));
            }else{
                contact_selected.remove(selected);
                arg1.setBackgroundColor(Color.parseColor("#162229"));
            }

我在这里忘记了什么?

你是 itmes/views 的第 #### 的受害者,当用户滚动列表时,它会被回收。您可以在此站点和许多博客上阅读很多关于此 'feature' 的内容。

您的代码应该记住(例如在布尔数组或数组列表中)每个项目的 'selected' 状态。您也可以向 list_item_person 添加一个布尔值 selected = false 。在 onClick() 中只更改值。

然后在 getView() 中也始终根据所选状态设置颜色。

要得到这个运行首先集中精力保持选中状态。所以删除或注释掉所有复制到数组的内容等等。