我想在一行中创建一个自定义列表视图,其中包含两个TextView和一个单选按钮。在listitem上单击单选按钮状态应该切换。我不能在这里使用Simple Adapter。
我已经问过这个问题Single choice ListView custom Row Layout,但找不到任何令人满意的解决方案。
我目前正在做的是使用simple_list_item_single_choice并将两个TextView的数据放在一个由一些空格分隔的单个文本中。但在这里情况越来越糟(如下图所示)。
我想要的是修复尺寸和价格的位置,并将列表视图作为单一选择。
列表的XML布局可以是:
**<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="200dp" />
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="70dp" />
<RadioButton
android:id="@+id/radioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>**
如何为此制作自定义适配器?
答案 0 :(得分:91)
我有类似的情况,但很容易修复。试试这个:
扩展ListActivity并设置自定义列表适配器
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //if you need title to be hidden
setContentView(R.layout.activity_add_to_cart_select_service_plan);
setListAdapter(adapter);
}
创建一个字段以在适配器中存储选定的索引位置
int selectedIndex = -1;
提供界面
public void setSelectedIndex(int index){
selectedIndex = index;
}
根据getView()
中选定的索引,将选中状态设置为true或false@Override
public View getView(int position, View convertView, ViewGroup parent) {
RadioButton rbSelect = (RadioButton) convertView
.findViewById(R.id.radio1);
if(selectedIndex == position){
rbSelect.setChecked(true);
}
else{
rbSelect.setChecked(false);
}
}
将单选按钮设置为可对焦且可点击的属性为'false'
<RadioButton
android:id="@+id/radio1"
android:checked="false"
android:focusable="false"
android:clickable="false"
/>
将listview descendantFocusability设置为'beforeDescendants'
<ListView
android:id="@android:id/list"
android:choiceMode="singleChoice"
android:descendantFocusability="beforeDescendants"
/>
覆盖onListItemClick
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
adapter.setSelectedIndex(position);
adapter.notifyDataSetChanged();
}
就是这样......运行并检查
答案 1 :(得分:12)
我整个上午都在寻找这个问题的答案,到目前为止我发现的最有用的事情是this article。
虽然我还没有实现它所建议的解决方案,但听起来它似乎正在走上正轨。
基本上,单选ListView
期望您提供的小部件实现Checkable
接口。 LinearLayout
等人没有。因此,您需要创建一个继承LinearLayout
(或您希望用于项目的任何布局)的自定义布局,并实现必要的界面。
答案 2 :(得分:3)
用 Hack处理类似的问题(不是一个完美的解决方案......但仍然有效......)
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
for (int i = 0; i < parent.getCount() ; i ++)
{
View v = parent.getChildAt(i);
RadioButton radio = (RadioButton) v.findViewById(R.id.radio);
radio.setChecked(false);
}
RadioButton radio = (RadioButton) view.findViewById(R.id.radio);
radio.setChecked(true);
}
});
答案 3 :(得分:-1)
**
<TextView
android:id="@+id/tv_size"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="200dp" />
<TextView
android:id="@+id/tv_price"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="70dp" />
<RadioButton
android:id="@+id/radioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
**