Мой вопрос заключается в том, как получить доступ и изменить режим checkBox для любого элемента списка.У меня есть файл шаблона 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 отлично работает, кстати, поэтому, по крайней мере, он правильно регистрирует положение.
Спасибо за любую помощь.
EDIT - я сейчас пытаюсь создать подкласс 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;
}
}
И для справки, вот XML ListActivity, который я делаю:
<?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 ...?
Надеюсь, я объяснил это ясно.