android 自定义单选列表视图

o75abkj4  于 2023-01-07  发布在  Android
关注(0)|答案(5)|浏览(190)

我想做一个自定义列表视图有两个文本视图和一个单选按钮在一行。并在列表项单击单选按钮的状态应该切换。我不能在这里使用简单适配器。
我已经问过这个问题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>**

如何使自定义适配器?

ruarlubt

ruarlubt1#

我也遇到过类似的情况,但很容易就解决了。试试这个:
1.扩展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);
}

1.创建字段以存储适配器中的选定索引位置

int selectedIndex = -1;

1.为其提供接口

public void setSelectedIndex(int index){
    selectedIndex = index;
}

1.根据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);
    }
}

1.将单选按钮的可聚焦和可单击属性设置为“false”

<RadioButton
     android:id="@+id/radio1"
     android:checked="false"
     android:focusable="false"
     android:clickable="false"
 />

1.将列表视图后代焦点可用性属性设置为“beforeDescendants”

<ListView
    android:id="@android:id/list"
    android:choiceMode="singleChoice"
    android:descendantFocusability="beforeDescendants"
/>

1.覆盖列表项单击

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    adapter.setSelectedIndex(position);
    adapter.notifyDataSetChanged();
}

就这样...跑过去看看

bn31dyow

bn31dyow2#

我整个上午都在寻找这个问题的答案,到目前为止我找到的最有用的东西是this article
虽然我还没有实现它所建议的解决方案,但听起来它走上了正确的道路。
基本上,单选ListView期望您提供给它的小部件实现Checkable接口,LinearLayout和其他小部件不期望,因此您需要创建一个自定义布局,继承LinearLayout(或任何您想用于项目的布局)并实现必要的接口。

djp7away

djp7away3#

使用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);


            }
        });
cuxqih21

cuxqih214#

尝试设置ListViewandroid:choiceMode属性

<ListView
    ...
    android:choiceMode="singleChoice" />
w46czmvw

w46czmvw5#

**

<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" />

**

相关问题