Android:带有单选按钮的两行列表视图,无法选择项目

时间:2017-02-14 18:34:46

标签: android android-layout listview xml-layout

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

这会按照我想要的方式显示列表,但我无法选择任何项目(点击项目时单选按钮保持为空)。是什么给了什么?

2 个答案:

答案 0 :(得分:0)

不确定这在AOSP中是如何工作的(他们可能会使用非标准逻辑进行布局),但是使用标准列表视图时,关键是 View的根项必须实现Checkable接口

所以,基于this answer,我做了以下事情:

  • 创建了一个CheckableLayout,派生自LinearLayout,否则就像答案中所述
  • 将simple_list_item_2_single_choice.xml副本中的顶级视图更改为CheckableLayout(这需要一个完全限定的类名)。

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

答案 1 :(得分:0)

我不确定您需要知道什么,但可以使用以下方式设置单选按钮:

radioButton.setChecked(true);

如果您需要在单击视图时设置radiobutton,我认为您可以在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;
}

如果有效,请告诉我。