选中的简单列表项目是单击时检查多个项目

时间:2011-08-17 15:09:03

标签: android list listview

好吧,所以我正在创建一个简单的待办事项列表应用程序,它从一个字符串数组中读取项目,并将它们作为simple_list_item_checked显示在列表视图中。一切都很好,我已经设置了onClickListener,所以它会检查我正在点击什么,但是,当我点击一个项目时,它还检查项目8项,重复。 (即,我点击顶部项目,它会得到一个检查,项目8项下来检查,然后8检查后等,等等)这是主要活动的代码:

 package com.disneyland;

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

public class Launch extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] Rides = getResources().getStringArray(R.array.rides);
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, Rides));

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

        lv.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                CheckedTextView check = (CheckedTextView)view;
                check.setChecked(!check.isChecked());

            }
        });



    }
}

显然,我的问题是为什么会发生这种情况,我该如何解决?

3 个答案:

答案 0 :(得分:1)

我也遇到了这个问题,并进行了快速修复。 我按照icecreamman的链接发现我的ListView XML缺少这一行:

android:choiceMode="multipleChoice" 

这允许选择多个项目。如果我选择了singleChoice,则可以随时检查列表中的一个项目,例如单选按钮。这条线修复了我的问题。

答案 1 :(得分:0)

我不能肯定地说,但我有猜测。你在适配器的getView方法中使用convertView做了什么吗?如果是这种情况,您似乎没有正确地遵循convertView模式。是否是在给定时间屏幕上有大约7或8个列表项?您可能无法正确返回正确的视图。

如果您不熟悉,可以从Android手册中摘录一下ListViews的详细说明:http://commonsware.com/Android/excerpt.pdf

答案 2 :(得分:0)

我意识到这是一个相当古老的帖子,所以你可能已经解决了它,但为了像我这样的人来寻找答案的好处,我会分享我发现的东西。

我遇到了类似的问题,并对此问题进行了一些研究。本文:http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/给出了一些答案并解释了为什么会发生这种情况。似乎android listView只能“记住”它在任何时候在屏幕上看到的视图类型,以便保留内存。因此,当您的适配器在滚动时正确显示不同的数据时,刻度线将被视为另外7个其他视图。

一个解决方案(如果您希望始终勾选相同的行)是使用上面文章中的示例告诉listView使用2个或更多不同的行类型。

如果要动态应用刻度,则需要更新提供listView的适配器,然后调用adapter.notifyDataSetChanged更新列表。