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;
}
如果有效请告诉我。
我想显示配对的蓝牙设备列表,让用户 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;
}
如果有效请告诉我。