45 Stimmen

Wie RadioGroup in ListView benutzerdefinierten Adapter zu verwenden?

Ich möchte eine einzelne Auswahlmöglichkeit in meiner Liste anzeigen. Ich verwende RadioButton in meinem listView Reihe. Ich weiß, dass RadioGroup wird für die Einzelauswahl verwendet.

Das Problem ist jedoch, dass ich die RadioButton in meinem ListRowView . Jetzt möchte ich alle meine Listenelemente in einer einzigen Liste hinzufügen RadioButton . Ich verwende Custom Adapter und in getView() . Ich bekomme die RadioButton en getView() aber wenn Sie es hinzufügen möchten RadioGroup heißt es

"Ansicht hat bereits ein Elternteil, rufen Sie removeView() im Elternteil vorher auf"

Und ich weiß, dass es stimmt, aber wenn ich es aus der Ansicht entferne. Dann ist es nicht sichtbar.

Ich versuche auch, die folgenden Dokumente zu erstellen und hinzuzufügen RadioButton programmatisch. Und dann fügen Sie es in RadioGrop . Und dann zur Ansicht der Listenzeile. Aber dieses Mal ist der übergeordnete RadioGroup , so heißt es wieder

"Ansicht hat bereits ein Elternteil, rufen Sie removeView() im Elternteil vorher auf"

Ich möchte jeweils nur ein Element in der Liste auswählen. Mein Code ist wie folgt.

getView

 public class MyAdapter extends ArrayAdapter < MyMenuItem > {

    private LayoutInflater mInflater ;

    int                    mResource ;
    List < MyMenuItem >    mData ;
    Context context;

    public MyAdapter ( Context context , int resource , int textViewResourceId , List < MyMenuItem > data ) {
        super ( context , resource , textViewResourceId , data ) ;
        this.context = context;
        mData = data ;
        mResource = resource ;
        mInflater = ( LayoutInflater ) getSystemService ( Context.LAYOUT_INFLATER_SERVICE ) ;
    }

    @ Override
    public View getView ( int position , View convertView , ViewGroup parent ) {
        ViewHolder holder = null ;
        if ( convertView == null ) {
            convertView = mInflater.inflate ( mResource , null ) ;
            holder = new ViewHolder ( ) ;
            holder.icon = ( ImageView ) convertView.findViewById ( R.id.icon ) ;
            holder.text = ( TextView ) convertView.findViewById ( R.id.text ) ;
            holder.comment = ( TextView ) convertView.findViewById ( R.id.comment ) ;
            LinearLayout lin = ( LinearLayout ) convertView.findViewById ( R.id.linerList ) ;
            RadioButton rbtn = new RadioButton ( context );
            LayoutParams lparam = new LayoutParams ( LayoutParams.WRAP_CONTENT , LayoutParams.WRAP_CONTENT );
            rbtn.setSelected ( false );
            holder.check = rbtn;
            //radioGroup.addView ( rbtn );
            lin.addView ( rbtn , 0 );

            convertView.setTag ( holder ) ;
        } else {
            holder = ( ViewHolder ) convertView.getTag ( ) ;
        }

        holder.text.setText ( mData.get ( position ).getText ( ) ) ;
        holder.comment.setText ( mData.get ( position ).getComment ( ) ) ;

        holder.icon.setImageResource ( getApplicationContext ( ).getResources ( ).getIdentifier ( mData.get ( position ).getIcon ( ) ,
                "drawable" , getPackageName ( ) )

        ) ;

        return convertView ;
    }

}

Mein XML für die Zeile

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<LinearLayout
    android:id = "@+id/linerList"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="6dip" />
</LinearLayout>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_weight="1"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="My Application"
        android:textSize="20sp"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:textColor="@color/white" />
    <TextView
        android:id="@+id/comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout"
        android:textSize="14sp"
        android:textColor="@color/light_gray" />
</LinearLayout>

It look like this if I not use RadioGroup

0voto

Max Izrin Punkte 1178

Zu den bereits gegebenen Antworten hinzuzufügen, für einen modulareren Ansatz, haben alle Listenelemente erben von der gleichen Klasse/Interface, die eine Nachricht Funktion, die Ihnen erlauben würde, Massagen zu ihnen über den Adapter übergeben.
Der Adapter registriert sich mit jedem Element, das ihm hinzugefügt wird, so dass jedes Listenelement den Adapter aufrufen kann, um eine Nachricht zu senden. dann, in der RadioButton-Listener können Sie eine Nachricht an alle anderen Radio-Buttons zu deaktivieren, schalten Sie die gedrückte ein, dann schließlich benachrichtigen Datensatz auf den Adapter geändert.

Ich habe eine ListAdapter Klasse und eine ListItem abstrakte Klasse, die ziemlich robust sind; Ich werde an jeden, der es braucht senden.
Mehrere Listenelementtypen werden unterstützt.

0voto

Mohamed Sajjadh Punkte 129

Sie können diese Lösung ausprobieren. Definieren Sie eine Variable um die aktuell ausgewählte Position zu erhalten und machen Sie folgendes innerhalb des benutzerdefinierten Adapters.

 singleRadio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            checkedButtonPosition = position;
  notifyDataSetChanged();
        }
    });

    if (checkedButtonPosition == position){
        singleRadio.setChecked(true);
    }else {
        singleRadio.setChecked(false);
    }

-1voto

harish Punkte 255

Sie brauchen die gleiche Leistung oder eine andere...

Was ich meine, ist, dass Sie nur eine der Sprachen aus der Liste auswählen müssen. Ist das richtig?

anpassen. Ich werde ein Beispiel dafür geben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X