Android: двухстрочный список с переключателями, нельзя выбирать элементы

Я хотел бы отобразить список сопряженных устройств Bluetooth и позволить пользователю выбрать одно из них. Я пытаюсь создать двухстрочный список (одна строка для понятного имени устройства, другая для MAC-адреса) с переключателями.

С этой целью я скопировал simple_list_item_2_single_choice.xml в свой проект и создайте представление списка со следующим кодом:

listView = new ListView(activity);
listView.setItemsCanFocus(false);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
ArrayAdapter<BluetoothDevice> listViewAdapter = new ArrayAdapter<BluetoothDevice>(activity,
    R.layout.simple_list_item_2_single_choice, android.R.id.text1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView text1 = (TextView) view.findViewById(android.R.id.text1);
        TextView text2 = (TextView) view.findViewById(android.R.id.text2);

        text1.setText(getItem(position).getName());
        text2.setText(getItem(position).getAddress());
        return view;
    }
};
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> devices = btAdapter.getBondedDevices();
// addAll() is not supported on APIs below 11
for (BluetoothDevice device : devices)
    listViewAdapter.add(device);
listView.setAdapter(listViewAdapter);

Это отображает список так, как я хочу, но я не могу выбрать какие-либо элементы (переключатель остается пустым, когда я нажимаю элемент). Что дает?


person user149408    schedule 14.02.2017    source источник


Ответы (2)


Не уверен, как это работало в AOSP (они могли использовать нестандартную логику для макета), но со стандартным представлением списка ключевым является то, что корневой элемент представления должен реализовывать интерфейс Checkable.

Итак, основываясь на этом ответе, я сделал следующее:

  • Создал CheckableLayout, производный от LinearLayout, в противном случае, как описано в ответе
  • Изменил представление верхнего уровня в моей копии simple_list_item_2_single_choice.xml на CheckableLayout (для этого требуется полное имя класса).

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

person user149408    schedule 14.02.2017

я не уверен, что вам нужно знать, но переключатель можно установить с помощью этого:

radioButton.setChecked(true);

И если вам нужно установить радиокнопку, проверенную при нажатии на представление, я думаю, вы можете сделать в своем getView что-то вроде (где "радио" - это ваш радиоидентификатор, установленный в вашем макете):

 public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    TextView text1 = (TextView) view.findViewById(android.R.id.text1);
    TextView text2 = (TextView) view.findViewById(android.R.id.text2);
    RadioButton rbutton = (RadioButton) view.findViewById(R.id.radio);
    view.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View v) {
            rbutton.setChecked(true);
        }
    });

    text1.setText(getItem(position).getName());
    text2.setText(getItem(position).getAddress());
    return view;
}

Дайте мне знать, если работает.

person Diekrul    schedule 14.02.2017