如何在ListView中获取RadioGroup中的一对Radio Buttons的状态?

时间:2014-02-28 16:31:16

标签: android listview radio-button radio-group

我有一个带有自定义列表行的列表视图。在每个列表视图的行中,有一个广播组,其中包含2个单选按钮

我需要动态地了解 ListView (已选中或未选中)的每一行 RadioButtons 的状态,因为用户点击其中一个< strong> RadioGroup的选项。

我的主要xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff3f2f2"
    android:orientation="horizontal" >

    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="#00ffffff"
        android:gravity="center" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00ffffff"
            android:gravity="center_horizontal"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="@string/titulo_cabecalho"
            android:textColor="#ff000000"
            android:textSize="36sp" >
        </TextView>
    </RelativeLayout>

    <!-- Footer aligned to top -->

    <include layout="@layout/footer" />

    <RelativeLayout
        android:id="@+id/selectEscola"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/footer"
        android:layout_below="@id/header"
        android:layout_centerInParent="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="4dp"
        android:background="#00ffffff"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Chamada"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#c0000000" />

        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginTop="80dp"
            android:layout_marginBottom="80dp"
            android:scrollbars="none"
            android:background="@drawable/border" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >

                <ListView
                    android:id="@+id/listChamada"
                    android:layout_width="wrap_content"
                    android:layout_height="0dip"
                    android:layout_weight="1"
                    android:divider="#b5b5b5"
                    android:dividerHeight="1dp"
                    android:listSelector="@drawable/list_selector"
                    android:padding="2dp" />
            </LinearLayout>
        </ScrollView>
    </RelativeLayout>

</RelativeLayout>

我的自定义行是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal"
    android:padding="2dip"
    android:background="@drawable/border2" >

    <LinearLayout
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="34dip"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="5dip"
        android:padding="3dip"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/listEdit"
            android:layout_width="24dip"
            android:layout_height="24dip"
            android:layout_marginTop="2dip"
            android:src="@drawable/list" />

        <ImageView
            android:id="@+id/list_image"
            android:layout_width="24dip"
            android:layout_height="24dip"
            android:layout_marginLeft="20dip"
            android:layout_marginTop="2dip"
            android:src="@drawable/boy" />
    </LinearLayout>


    <TextView
        android:id="@+id/nomealuno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/matriculaaluno"
        android:layout_alignTop="@+id/thumbnail"
        android:text="Nome:"
        android:textColor="#040404"
        android:textSize="18sp"
        android:textStyle="bold"
        android:typeface="sans" />

    <TextView
        android:id="@+id/matriculaaluno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/nomealuno"
        android:layout_marginTop="2dp"
        android:layout_toRightOf="@+id/thumbnail"
        android:text="Matrícula: "
        android:textColor="#343434"
        android:textSize="10sp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="4dp"
        android:orientation="vertical" >

        <RadioGroup
            android:id="@+id/radiogroupChamada"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:textColor="#343434"
            android:textSize="12sp"
            android:textStyle="bold" >

            <RadioButton
                android:id="@+id/radiobuttonPresente"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:button="@null"
                android:drawableRight="@drawable/btn_check"
                android:paddingLeft="22dip"
                android:text="Presente" >
            </RadioButton>

            <RadioButton
                android:id="@+id/radiobuttonAusente"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:button="@null"
                android:drawableRight="@drawable/btn_check"
                android:paddingLeft="22dip"
                android:text="Ausente" >
            </RadioButton>
        </RadioGroup>
    </LinearLayout>

</RelativeLayout>

这就是我填充ListView的方式:

1 - 将从服务器接收的数据以Json格式接收的代码,在数组和hashmap中(我使用数组引用ListView和hashmap中存在的数据来填充它):

if (success2 == 1) // If data from server was sent without errors
{
    int lenght = jArray.length();
    optionsMatriculas = new ArrayList<String>(lenght);
    optionsNomesAlunos = new ArrayList<String>(lenght);
    optionsSexoAlunos = new ArrayList<String>(lenght);

    for (int i = 0; i < jArray.length(); i++)
    {
        try
        {
            JSONObject oneObject = jArray.getJSONObject(i);
            resultDataCodigoAluno = oneObject.getString("cdaluno");
            resultDataNomes = oneObject.getString("nome");
            resultDataSexo = oneObject.getString("sexo");

            optionsMatriculas.add(resultDataCodigoAluno);
            optionsNomesAlunos.add(resultDataNomes);
            optionsSexoAlunos.add(resultDataSexo);

            HashMap<String, String> hm = new HashMap<String, String>();

            if (resultDataSexo.equals("M"))
            {
                hm.put("sexo", Integer.toString(R.drawable.boy));
            }
            else
            {
                hm.put("sexo", Integer.toString(R.drawable.girl));
            }

            hm.put("matricula", resultDataCodigoAluno);
            hm.put("nome", resultDataNomes);

            alunosLista.add(hm);

        }
        catch (JSONException e)
        {
            Log.e("log_tag", "Error in parsing JSon: " + e.toString());
        }
    }

    Message msg = myHandler.obtainMessage();
    myHandler.sendMessage(msg);
}

这是填充列表视图的代码:

final Handler myHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        try
        {
            SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), alunosLista, R.layout.list_row, from, to);
            listaChamada.setAdapter(adapter);

            int lenght = adapter.getCount();
            int totalHeight = 0;

            for (int i = 0; i < lenght; i++)
            {
                View listItem = adapter.getView(i, null, listaChamada);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }

            ViewGroup.LayoutParams params = listaChamada.getLayoutParams();
            params.height = totalHeight + 4 + (listaChamada.getDividerHeight() * (adapter.getCount() - 1));
            listaChamada.setLayoutParams(params);
            listaChamada.requestLayout();                   
        }
        catch (Exception e)
        {
            Log.e("log_tag", "Erro no ListView: " + e.toString());
        }
    }//handleMessage 
};//myHandler 

我在谷歌搜索过,但仍然没有运气。 感谢您对此的任何线索。

1 个答案:

答案 0 :(得分:0)

实际上,Android适配器并不那么简单。 SimpleAdapter只能应用于一些非常简单/无关紧要的情况。通常,最好创建自己的BaseAdapter:它提供了更大的灵活性,并且不需要大量代码。 在您的情况下,我建议使用如下的smth(您未能在from构造函数中提供toSimpleAdapter的任何信息,所以我猜到了:

主要部分是适当的适配器,它应存储所选的单选按钮ID并将其提供给活动/接收器。

<强> MyAdapter.java

public class MyActivity extends Activity implements MyListAdapter.RadioButtonsListener {

    private static final String TAG = "MyActivity";

    ArrayList<HashMap<String, String>> mAlunosLista = new ArrayList<HashMap<String, String>>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        final ListView listaChamada = (ListView) findViewById(R.id.listChamada);
        // Fill list with data
        Random sexGen = new Random();

        for (int i = 0; i < 20; i++) {
            addTextData(sexGen.nextBoolean() ? "M" : "F", Integer.toString(i + 100), "Name" + i + " Surname" + i);
        }

        final MyListAdapter adapter = new MyListAdapter(mAlunosLista);

        listaChamada.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();

        final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();

        adapter.setRadioListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();

        adapter.setRadioListener(null);
    }

    /**
     * Adds test data to adapter array
     */
    private void addTextData(final String resultDataSexo, final String resultDataCodigoAluno, final String resultDataNomes) {
        HashMap<String, String> hm = new HashMap<String, String>();

        // NOTE: not sure why you convert ids to strings
        if (resultDataSexo.equals("M")) {
            hm.put("sexo", Integer.toString(R.drawable.boy));
        } else {
            hm.put("sexo", Integer.toString(R.drawable.girl));
        }

        hm.put("matricula", resultDataCodigoAluno);
        hm.put("nome", resultDataNomes);

        mAlunosLista.add(hm);
    }

    @Override
    public void onRadioButtonClicked(final int position, final HashMap<String, String> itemData, final int clickedId) {
        Log.d(TAG, "Clicked item at " + position + ", checked id: " + (clickedId == R.id.radiobuttonPresente ? "Presente" : "Ausente"));
    }
}

在其他文件下面我已经更改为具有可编辑的示例(请参阅help topic如何询问有关代码问题的问题。)

<强> main.xml中

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

<!--suppress AndroidLintUselessParent, AndroidLintContentDescription -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff3f2f2"
    android:orientation="horizontal" >

    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="#00ffffff"
        android:gravity="center" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00ffffff"
            android:gravity="center_horizontal"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="Title"
            android:textColor="#ff000000"
            android:textSize="36sp" >
        </TextView>
    </RelativeLayout>

    <!-- Footer aligned to top

    <include layout="@layout/footer" />
    -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/footer"
        android:layout_alignParentBottom="true" />

    <RelativeLayout
        android:id="@+id/selectEscola"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_above="@id/footer"
        android:layout_below="@id/header"
        android:layout_centerInParent="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="4dp"
        android:background="#00ffffff"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Chamada"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#c0000000" />

        <ListView
            android:id="@+id/listChamada"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:divider="#b5b5b5"
            android:dividerHeight="1dp"
            android:listSelector="@android:drawable/list_selector_background"
            android:padding="2dp" />
    </RelativeLayout>

</RelativeLayout>

<强> list_row.xml

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal"
    android:padding="2dip"
    android:background="@android:color/darker_gray" >

    <LinearLayout
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="5dip"
        android:padding="3dip"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/listEdit"
            android:layout_width="24dip"
            android:layout_height="24dip"
            android:layout_marginTop="2dip"
            android:src="@android:drawable/ic_menu_add" />

        <ImageView
            android:id="@+id/list_image"
            android:layout_width="24dip"
            android:layout_height="24dip"
            android:layout_marginLeft="20dip"
            android:layout_marginTop="2dip"
            android:src="@android:drawable/ic_delete" />
    </LinearLayout>

    <TextView
        android:id="@+id/nomealuno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/matriculaaluno"
        android:layout_alignTop="@+id/thumbnail"
        android:text="Nome:"
        android:textColor="#040404"
        android:textSize="18sp"
        android:textStyle="bold"
        android:typeface="sans" />

    <TextView
        android:id="@+id/matriculaaluno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/nomealuno"
        android:layout_marginTop="2dp"
        android:layout_toRightOf="@+id/thumbnail"
        android:text="Matrícula: "
        android:textColor="#343434"
        android:textSize="10sp" />

    <RadioGroup
        android:id="@+id/radiogroupChamada"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/thumbnail"
        android:orientation="vertical"
        android:textColor="#343434"
        android:textSize="12sp"
        android:textStyle="bold" >

        <RadioButton
            android:id="@+id/radiobuttonPresente"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="22dip"
            android:text="Presente" />
        <!--android:drawableRight="@drawable/btn_check"-->

        <RadioButton
            android:id="@+id/radiobuttonAusente"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="22dip"
            android:text="Ausente" />
        <!--android:drawableRight="@drawable/btn_check"-->
    </RadioGroup>

</RelativeLayout>

<强> MyActivity.java

public class MyActivity extends Activity implements MyListAdapter.RadioButtonsListener {

    private static final String TAG = "MyActivity";

    ArrayList<HashMap<String, String>> mAlunosLista = new ArrayList<HashMap<String, String>>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        final ListView listaChamada = (ListView) findViewById(R.id.listChamada);
        // Fill list with data
        Random sexGen = new Random();

        for (int i = 0; i < 20; i++) {
            addTextData(sexGen.nextBoolean() ? "M" : "F", Integer.toString(i + 100), "Name" + i + " Surname" + i);
        }

        final MyListAdapter adapter = new MyListAdapter(mAlunosLista);

        listaChamada.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();

        final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();

        adapter.setRadioListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();

        adapter.setRadioListener(null);
    }

    /**
     * Adds test data to adapter array
     */
    private void addTextData(final String resultDataSexo, final String resultDataCodigoAluno, final String resultDataNomes) {
        HashMap<String, String> hm = new HashMap<String, String>();

        // NOTE: not sure why you convert ids to strings
        if (resultDataSexo.equals("M")) {
            hm.put("sexo", Integer.toString(R.drawable.boy));
        } else {
            hm.put("sexo", Integer.toString(R.drawable.girl));
        }

        hm.put("matricula", resultDataCodigoAluno);
        hm.put("nome", resultDataNomes);

        mAlunosLista.add(hm);
    }

    @Override
    public void onRadioButtonClicked(final int position, final HashMap<String, String> itemData, final int clickedId) {
        Log.d(TAG, "Clicked item at " + position + ", checked id: " + (clickedId == R.id.radiobuttonPresente ? "Presente" : "Ausente"));

} }

PS此外,看起来你正试图对ListView进行攻击。我不知道为什么你需要它,但最好避免直到完全必要。