Список AndroidДействие по списку элементовНажмите с CheckBox - PullRequest
1 голос
/ 26 июня 2011

Мой вопрос заключается в том, как получить доступ и изменить режим 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 ...?

Надеюсь, я объяснил это ясно.

Ответы [ 3 ]

3 голосов
/ 26 июня 2011

Я думаю, что это немного более глубокий вопрос, и не нужен прямой ответ.

Чего ты хочешь достичь? Вы действительно хотите сделать выбранными ТОЛЬКО флажки, которые вы видите на экране? Имейте в виду, что это может быть довольно случайным - представление списка содержит только представления элементов для флажков, которые видны на экране, и они повторно используются для других элементов всякий раз, когда элемент прокручивается за пределами экрана.

Я бы сказал, что почти наверняка вам нужно изменить состояние всех флажков в вашем списке (даже невидимых) или некоторого их подмножества (например, раздел). Что действительно переводит на правильный путь, это должно быть сделано:

  • измените вашу модель данных соответствующим образом маркировка соответствующих флагов, выбранных в соответствующих элементах модели данных (некоторые логические значения, которые вы сохраняете для каждого элемента)
  • вызовите notifyDataSetChanged () на вашем адаптере.

В результате в виде списка будут воссозданы все виды, которые видны на экране. Предполагая, что ваш «getView ()» в адаптере написан правильно, он будет читать правильную модель и обновлять проверенное состояние элемента соответствующим образом. По notifyDataSetChanged - если у вас есть 10 элементов, видимых на экране, вам будет 10 раз вызываться getView () для каждого видимого элемента.

1 голос
/ 26 июня 2011

Я рекомендую использовать android:choiceMode="multipleChoice" вместо того, чтобы вручную манипулировать строками таким образом.Виджет строки должен будет реализовывать интерфейс Checkable, что можно сделать, используя CheckedTextView в качестве самой строки или , создав подкласс желаемого контейнера и внедрив в него Checkable .

0 голосов
/ 26 июня 2011

Вы используете "глобальный" вид вместо своего вида строки.Попробуйте вот так:

 @Override
 protected void onListItemClick(ListView l, View v, int position, long id) {
   super.onListItemClick(l, v, position, id);

    CheckBox checkbox = (CheckBox) v.findViewById(R.id.checkbox); 
    if (checkbox.isChecked() == false) {
        checkbox.setChecked(true); 
    } else {
        checkbox.setChecked(false); 
    }
 }
...