ListView заполнен CheckBoxes - они сходят с ума - PullRequest
1 голос
/ 18 января 2010

Мне нужна твоя помощь.Я действительно новичок в Android, разрабатываю в Eclipse с последним 2.1 SDK.

Это действительно просто.Я делаю ListView, который заполнен виджетами Checkbox.

Мой код:

public class HelloAndroid extends Activity {

    static final String[] COUNTRIES = new String[] {
        "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
        "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
        "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
        "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium"}; 

    protected ListView myList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myList = (ListView)findViewById(R.id.myList);
        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.myBox, COUNTRIES); 
        myList.setAdapter(myAdapter);
    }
}

И это XML-файл Layout (row.xml), состоящий из одного флажка:

<?xml version="1.0" encoding="utf-8"?>
<CheckBox
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myBox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"/>

Теперь, если в массиве COUNTRIES достаточно строк и вы можете прокрутить список, вы увидите, что если вы проверите один CheckBox и прокрутите вниз, другой CheckBox будет проверен автоматически.И если вы установите еще несколько флажков, другие будут отмечены автоматически, или те, которые были отмечены, не проверены.

Я также пробовал android:focusable="false" для CheckBox (в XML), а также android:focusableInTouchMode, как описано в некоторых аналогичных темах, но, кажется, ничто не помогает ...

Похоже, это ошибка ??

1 Ответ

4 голосов
/ 18 января 2010

То, что происходит, - то, что Android повторно использует CheckBox представлений, которые он создает, чтобы отобразить список для экономии памяти. Вместо того, чтобы создавать новый CheckBox для каждого элемента в вашем списке, Android создает достаточно для заполнения экрана, обновляя их для отображения соответствующих данных для элементов, которые в данный момент видны.

Если у вас нет связи между данными в вашем адаптере и состоянием CheckBox в представлении, то будет отображаться, что множество CheckBox связаны, хотя на самом деле это тот же CheckBox с другой меткой.

Вы установили атрибут choiceMode вашего ListView? Если вы это сделаете, ListView сообщит, что вы выбрали.

Также рассмотрите возможность использования CheckedTextView класса вместо CheckBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...