Android 选中的简单列表项在单击时检查多个项
好的,我正在制作一个简单的待办事项列表应用程序,它从一组字符串数组中读取项目,并在列表视图中将它们显示为一个简单的列表项目。一切都很好,我设置了onClickListener,这样它会检查我正在点击的内容,但是,当我点击一个项目时,它也会检查项目8,重复。(即,我点击顶部的项目,它得到一个检查,项目8向下得到检查,然后8向下得到检查,等等)以下是主要活动的代码:Android 选中的简单列表项在单击时检查多个项,android,list,listview,Android,List,Listview,好的,我正在制作一个简单的待办事项列表应用程序,它从一组字符串数组中读取项目,并在列表视图中将它们显示为一个简单的列表项目。一切都很好,我设置了onClickListener,这样它会检查我正在点击的内容,但是,当我点击一个项目时,它也会检查项目8,重复。(即,我点击顶部的项目,它得到一个检查,项目8向下得到检查,然后8向下得到检查,等等)以下是主要活动的代码: package com.disneyland; import android.app.ListActivity; import a
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());
}
});
}
}
package com.disneyland;
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.CheckedTextView;
导入android.widget.ListView;
导入android.widget.AdapterView.OnItemClickListener;
公共类启动扩展了ListActivity{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
String[]Rides=getResources().getStringArray(R.array.Rides);
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_checked,Rides));
ListView lv=getListView();
lv.setTextFilterEnabled(真);
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
CheckedTextView检查=(CheckedTextView)视图;
check.setChecked(!check.isChecked());
}
});
}
}
显然,我的问题是为什么会发生这种情况,以及如何解决它?我不能肯定,但我有一个猜测。您是否正在适配器的getView方法中使用convertView执行某些操作?如果是这种情况,您似乎没有正确遵循convertView模式。在给定的时间内,您的屏幕上是否有大约7或8个列表项?您可能没有正确返回正确的视图
如果你不熟悉使用列表视图,这本摘自安卓系统书籍的文章将为你提供一个很好的解释:我意识到这是一篇很老的文章,所以你可能已经解决了它,但为了像我这样来寻找答案的人的利益,我将分享我的发现 我也遇到过类似的问题,并对这个问题做了一些研究。本文:给出了一些答案,并解释了为什么会发生这种情况。为了保存内存,android listView似乎只“记住”屏幕上任何时候可以看到的视图类型。因此,虽然您的适配器会在滚动时正确显示不同的数据,但勾号被视为其他7个视图中的一个不同视图 一种解决方案(如果您希望始终勾选相同的行)是使用上面文章中的示例来告诉listView使用2种或更多不同的行类型
如果希望动态应用刻度,则需要更新为listView提供数据的适配器,然后调用adapter.notifyDataSetChanged来更新列表。我也遇到了这个问题,并成功地解决了这个问题。 我跟踪了icecreamman的链接,发现我的ListView XML缺少一行:
android:choiceMode="multipleChoice"
这允许选择多个项目。如果我选择了singleChoice,那么在任何时候都只能检查列表中的一项,就像单选按钮一样。这句话解决了我的问题