我的問題是如何訪問和更改列表活動中的任何項目的複選框模式。我有一個帶有複選框和文本視圖的XML模板文件,這些文件定義了一行。這裏就是我試圖至今:顯然Android listActivity onListItemClick與複選框
@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只觸發第一個複選框(實際上,它確實名單的任何部分的第一個複選框,我看我的屏幕)。我不知道用什麼函數來獲取任何行的複選框。吐司工作順利,所以至少它正確登記位置。
感謝您的任何幫助。
編輯 - 我現在試圖繼承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得到了一些正確的迴應:第一次點擊一個項目時,它的Toast標籤是「1」,它的背景變白,而第二次我爲同一個項目吐司時,我得到「 0「,背景變黑,這是預期的。
問題是如果我選擇item1(使其背景爲白色),然後向下滾動,我會注意到item11,item21,item31,...等等也有白色背景。但是當我點擊它們時,它們的ID屬性會變爲「1」,這意味着它們在技術上從未被點擊過!所以基本上當滾動「刷新」到下一個10列表時,它將複製前10個的顏色方案...?
希望我解釋清楚。
我認爲你是對的。到目前爲止,我所做的是創建一個新類,該子類是SimpleCursorAdapter的子類,並且我正在覆蓋getView()方法。它會好起來的,但我通過改變文本背景顏色來測試onClick的視圖,並且我得到了「回收」效果或稱爲它,如果我在我的屏幕上選擇item1,它假定我也選擇了item11,item21等(並更改所有背景顏色)。我應該如何使每個視圖的onClick獨一無二? – JDS
啊..這是另一個問題。看看這篇文章 - 它詳細解釋:http://developer.android.com/resources/articles/listview-backgrounds.html。在使用自定義背景的情況下,使用cacheColorHint(或禁用在Android listView中實現的優化)是所有問題。 –
嗯,我不認爲這是我的問題,因爲我做了cacheColorHint,我仍然得到item1的onClick應用於item11,item21等(基本上每當屏幕刷新到新的選項集)的回收問題。你的答案的最後一句提到notifyDataSetChanged - 我應該在哪裏實現?怎麼樣? – JDS