Android:带单选按钮的两行列表视图,不能select项

Android: Two-line list view with radio buttons, can’t select items

我想显示配对的蓝牙设备列表,让用户 select 一个。我正在尝试创建一个带有单选按钮的两行列表视图(一行用于友好设备名称,另一行用于 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);

这会按照我想要的方式显示列表,但我不能 select 任何项目(当我点击一个项目时,单选按钮保持空白)。给出了什么?

不确定这在 AOSP 中是如何工作的(他们可能使用 non-standard 布局逻辑),但对于标准列表视图,关键是 View 的根项目必须实现Checkable接口.

因此,基于 this answer,我做了以下操作:

  • 创建了一个从 LinearLayout 派生的 CheckableLayout,否则就像答案中描述的那样
  • 将我的 simple_list_item_2_single_choice.xml 副本中的 top-level 视图更改为 CheckableLayout(这需要完全限定的 class 名称)。

通过这些更改,它可以按预期工作。我可以通过点击项目来检查它们,这些项目的行为就像一组单选按钮。

我不确定你需要知道什么,但是可以设置一个单选按钮来检查:

radioButton.setChecked(true);

如果您需要在单击视图时设置选中单选按钮,我认为您可以在 getView 中执行类似操作(其中 "radio" 是您在布局中设置的 radioId):

 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;
}

如果有效请告诉我。