2013-04-18 8 views
5

Ho cercato la domanda più e più volte, ci sono molte domande che ho trovato nello stackoverflow ma non ho trovato una soluzione. Ecco il mio problema Ho una lista di elemento in un LinearLayout come questo: enter image description hereSolo selezionare un solo pulsante di opzione da listview

Quando lo schermo viene prima, il pulsante dell'ultima Radion viene selezionata automaticamente. Ma se seleziono un altro pulsante radio, l'ultimo pulsante radio è già nello stato selezionato. Voglio selezionare solo un pulsante di radion ma allo stesso tempo quando viene visualizzato lo schermo, l'ultimo pulsante radio verrà selezionato automaticamente e gli altri automaticamente non verranno selezionati. Come posso ottenere questo. La mia classe adattatore è:

public class AdapterPaymentMethod extends ArrayAdapter<PaymentData> { 
    private Context context; 
    private boolean userSelected = false; 
    ViewHolder holder; 

    public AdapterPaymentMethod(Context context, int resource, 
      List<PaymentData> items) { 
     super(context, resource, items); 
     this.context = context; 
    } 

    /* private view holder class */ 
    private class ViewHolder { 
     RadioButton radioBtn; 
     Button btPaymentMethod; 
     // ImageView ivLine; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     holder = null; 
     PaymentData rowItem = getItem(position); 
     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(
        com.android.paypal.homeactivity.R.layout.list_item, null); 
      holder = new ViewHolder(); 
      holder.radioBtn = (RadioButton) convertView 
        .findViewById(com.android.paypal.homeactivity.R.id.rdb_payment_method); 
      holder.btPaymentMethod = (Button) convertView 
        .findViewById(com.android.paypal.homeactivity.R.id.bt_item_event); 
      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     if(position==getCount()-1 && userSelected==false){ 
      holder.radioBtn.setChecked(true); 
     Log.d("if position", ""+position); 
     } 
     else{ 
      holder.radioBtn.setChecked(false); 
      Log.d("else position", ""+position); 
     } 

     holder.radioBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       userSelected=true; 
       if(getCount()-1==position&&userSelected==true){   
       } 
       else if(getCount()-2==position&&userSelected==true) 
       { 
        holder.radioBtn.setChecked(true); 
       } 
      } 
     }); 



     holder.radioBtn.setText(rowItem.getRdbText()); 
     holder.btPaymentMethod.setText(rowItem.getBtText()); 
     return convertView; 
    } 
} 
+0

im bloccato anche su stessi problemi possono u mi aiuterà, ma in casella di controllo –

risposta

13

Mantenere il momento controllato RadioButton in una variabile nel vostro Activity. Nel OnClickListener del vostro RadioButtons fare questo:

// checks if we already have a checked radiobutton. If we don't, we can assume that 
// the user clicked the current one to check it, so we can remember it. 
if(mCurrentlyCheckedRB == null) 
    mCurrentlyCheckedRB = (RadioButton) v; 
    mCurrentlyCheckedRB.setChecked(true); 
} 

// If the user clicks on a RadioButton that we've already stored as being checked, we 
// don't want to do anything.  
if(mCurrentlyCheckedRB == v) 
    return; 

// Otherwise, uncheck the currently checked RadioButton, check the newly checked 
// RadioButton, and store it for future reference. 
mCurrentlyCheckedRB.setChecked(false); 
((RadioButton)v).setChecked(true); 
mCurrentlyCheckedRB = (RadioButton)v; 
+0

La soluzione funziona correttamente. Puoi spiegare il tuo codice. Non ho capito il tuo codice. Sono novizio. Grazie. – androidcodehunter

+1

Ho aggiunto alcuni commenti per spiegarlo. Se questo funziona per te, si prega di impostare la risposta come accettata! – Catherine

+1

Grazie per la tua spiegazione. Lo adoro. – androidcodehunter

5

Ecco il mio codice:

ListAdapter.java

public class ListAdapter extends BaseAdapter { 

    private Context context; 
    private String[] version; 
    private LayoutInflater inflater; 
    private RadioButton selected = null; 

    public ListAdapter(Context context, String[] version) { 
     this.context = context; 
     this.version = version; 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return version.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return version; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup viewGroup) { 

     final Holder holder; 
     if (view == null) { 
      holder = new Holder(); 
      view = inflater.inflate(R.layout.row_list, null); 

      holder.radioButton = (RadioButton) view.findViewById(R.id.radio1); 
      holder.textViewVersion = (TextView) view.findViewById(R.id.textView1); 
      holder.btnMore = (Button) view.findViewById(R.id.button1); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 
     } 

     holder.textViewVersion.setText(version[position]); 

     //by default last radio button selected 
     if (position == getCount() - 1) { 
      if (selected == null) { 
       holder.radioButton.setChecked(true); 
       selected = holder.radioButton; 
      } 
     } 

     holder.radioButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if (selected != null) { 
        selected.setChecked(false); 
       } 
       holder.radioButton.setChecked(true); 
       selected = holder.radioButton; 
      } 
     });  
    } 

    private class Holder { 
     private RadioButton radioButton; 
     private TextView textViewVersion; 
     private Button btnMore; 
    } 
} 

Spero che questo ti aiuta :)

+0

Grazie ... sei salva vita !! :) –

0

Prova questo hack.

Nel layout apportare queste modifiche.

<RadioButton 
    android:id="@+id/radio" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    **android:clickable="false" 
    android:focusable="false"** 
/> 

l'adattatore Basta aggiungere queste righe:

private int selectedPosition = -1; 

viewHolder.choiceButton = (RadioButton)convertView.findViewById(R.id.radio); 

if(selectedPosition == -1) { 
    viewHolder.choiceButton.setChecked(position==getCount()-1); 
} 
else{ 
    viewHolder.choiceButton.setChecked(selectedPosition == position); 
} 

In GetView() assegnano selectedPosition:

viewHolder.clickLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       selectedPosition = (int) view.getTag(); 
       notifyDataSetChanged(); 
      } 
     }); 
+0

Questo codice non funziona. I pulsanti radio multipli vengono selezionati. –

+1

Avete assegnato SelectedPosition al layout dei clic usando getTag()? –