【发布时间】:2011-09-23 00:28:44
【问题描述】:
我的问题是如何访问和更改列表活动中任何项目的复选框模式。我有一个带有复选框和文本视图的 XML 模板文件,它们定义了一行。到目前为止,这是我正在尝试的:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(this, "You selected: " + Integer.toString(position), Toast.LENGTH_LONG).show();
CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox);
if (checkbox.isChecked() == false) {
checkbox.setChecked(true);
} else {
checkbox.setChecked(false);
}
}
显然,尽管使用 R.id.checkbox 只会切换第一个复选框(实际上,它会执行我在屏幕上查看的列表的任何部分的第一个复选框)。我不确定使用什么函数来获取任何行的复选框。顺便说一句,Toast 工作正常,所以至少它正确地记录了位置。
感谢您的帮助。
编辑 - 我现在正在尝试继承 SimpleCursorAdapter 以更好地控制我想要的行为。这是那个子类:
public class musicPlaylist extends SimpleCursorAdapter {
private Cursor c;
private Context context;
private ArrayList<String> checkList = new ArrayList<String>();
private final static int SELECTED = 1;
private final static int NOT_SELECTED = 0;
public musicPlaylist(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.c = c;
this.context = context;
}
public View getView(int pos, View inView, ViewGroup parent) {
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.song_item, null);
}
this.c.moveToPosition(pos);
int columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
String song = this.c.getString(columnIndex);
TextView sTitle = (TextView) v.findViewById(R.id.text1);
sTitle.setText(song);
v.setId(NOT_SELECTED);
v.setTag(song);
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == NOT_SELECTED) {
v.setId(SELECTED);
Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show();
v.setBackgroundColor(Color.parseColor("#FFFFFF"));
} else {
v.setId(NOT_SELECTED);
Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show();
v.setBackgroundColor(Color.parseColor("#000000"));
}
}
});
return v;
}
}
作为参考,这里是我正在制作的 ListActivity 的 XML:
<?xml version="1.0" encoding="utf-8"?>
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false"
android:fastScrollEnabled="true"
android:cacheColorHint="#00000000"
/>
<TextView android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="No data"/>
当前行为:SD 卡中的歌曲列表被制作成一个很好的可滚动列表。我确实从 getView() 的 onClick 中得到了一些适当的响应:我第一次点击一个项目时,它的标签是“1”并且它的背景变白,而第二次我为同一个项目敬酒时,我得到“ 0" 并且背景变黑,这与预期的一样。
问题是如果我选择 item1(使其背景为白色)然后向下滚动,我会注意到 item11、item21、item31、... 等也有白色背景。但是当我点击它们时,它们的 ID 属性变为“1”,这意味着它们在技术上从未被点击过!所以基本上当滚动“刷新”到下一个10个列表时,它会复制前10个的配色方案......?
希望我解释清楚。
【问题讨论】:
标签: java android xml checkbox listactivity