Android ListView与RadioButton在singleChoice模式和自定义行布局

我有一个ListView,它是在singleChoice模式。所有我想要的是在一侧显示一个RadioButton,当点击突出显示说它被选中,以及当一个不同的一个点击,一个回到未选择,新的一个被选中。为什么这么难?这不应该是这么复杂。我花了DAYS寻找一个合适的答案,我没有找到任何东西,所以我希望以清晰和简洁的方式问。

我的列表视图的布局(R.layout.view_orders):

<?xml version="1.0" encoding="utf-8"?>
<ListView 
        android:choiceMode="singleChoice"
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@drawable/list_divider"
        android:dividerHeight="1px"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:cacheColorHint="#00000000">
</ListView>

我的自定义行(R.layout.orders_row):

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res/com.xxx.xxxxxx"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="6dip">

    <com.xxx.xxxxxx.VerticalLabelView
        app:text="SHORT"
        app:textColor="#666"
        app:textSize="14sp"
        android:id="@+id/state"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/quantity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/state" 
        android:layout_centerVertical="true"
        android:gravity="center"
        android:textSize="40sp"
        android:layout_margin="2dip"
        android:minWidth="30dip"
        android:textColor="#555" />


    <RelativeLayout
        android:layout_toRightOf="@id/quantity"
        android:layout_centerVertical="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/instrument"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#333"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            />


        <TextView
            android:id="@+id/deets"
            android:layout_below="@id/instrument"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textColor="#888"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            />

    </RelativeLayout>

        <RadioButton
            android:id="@+id/selector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            />

</RelativeLayout>

我的onCreate()方法:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_orders);
    client = new Client(handler);
    ola = new OrdersAdapter(this, R.layout.orders_row, Orders);
    setListAdapter(ola);
    final RelativeLayout loading = (RelativeLayout) findViewById(R.id.loading);
    panel = (PositionsPanel) findViewById(R.id.panel);
    Utility.showProgressBar(loading);
    client.Connect("orders");
}

现在一切底层的工作原理,你点击一个单选按钮,通过它的标签,我可以从列表中适当地选择该项目,并如何操作我想要的。但是,当单击第一个单选按钮时,将选择最后一个单选按钮。再次单击相同的单选按钮,它现在也被选中。单击它一次,没有任何反应,最后一个和第一个被选中。现在我单击列表中的任何其他人,它得到选择像预期。单击任何选定的单选按钮,没有任何反应,单选按​​钮保持选中状态。

我试过在onCreate()中使用以下:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_orders);
    client = new Client(handler);
    ola = new OrdersAdapter(this, android.R.layout.simple_list_item_single_choice, Orders);
    setListAdapter(ola);
    final RelativeLayout loading = (RelativeLayout) findViewById(R.id.loading);
    panel = (PositionsPanel) findViewById(R.id.panel);
    Utility.showProgressBar(loading);
    client.Connect("orders");
}

并且只显示没有单选按钮。真棒。

现在也许(阅读:很可能),我只是密集,不能想出这一点,但我已经看到这个问题很多没有真正的答案。许多参考其他教程或Commonsware家伙的书。然而,评论现在是老的,他的存储库已经改变了这么多,那些不再是正确的答案。

所以,有没有人有任何想法如何获得预期的功能呢?或者失败,只是通过我的GMail应用程序的源代码。 🙂

最佳答案
请记住,在ListView行项目是回收。这可能解释为什么一行上的操作影响另一行。在马克的书中,你会发现这一点的覆盖。

如果您使用带有列表的适配器,则可以在适配器上使用getView()为每个创建/回收的行添加一个点击处理程序,并确保在创建和回收行项时正确管理状态。

我的做法是将状态存储在我自己的数据结构中,然后使用getView()来反映UI中的用户向上和向下滚动ListView。可能有更好的解决方案,但是对我有用。

转载注明原文:Android ListView与RadioButton在singleChoice模式和自定义行布局 - 代码日志