6

Sto creando un'app Android l'interfaccia utente della mia applicazione è sotto data.Listview con Checkbox, RadioButton, Textview e il pulsante non funziona correttamente in Android

Facendo clic sul pulsante di invio, ho bisogno della casella di controllo selezionata e dei valori dei pulsanti di opzione.

Esempio Linux non selezionato, cc (pulsante di opzione) è selezionato.

I record vengono popolati dinamicamente nella visualizzazione elenco, ma non sono in grado di farlo funzionare. Un sacco di problemi ci sono.

  1. Quando si scorre il pulsante di opzione della vista elenco, viene automaticamente selezionato o deselezionato non è possibile mantenere lo stato del pulsante di opzione.
  2. Al clic sul pulsante che non riceve il pulsante di opzione selezionato e la casella di controllo.

Di seguito è riportato il mio layout e il programma java. Suggeriscimi di ottenere i valori corretti

application image

main.xml

<ListView 
    android:id="@+id/my_list" 
    android:layout_width="fill_parent" 
    android:layout_height="199dp" /> 

<Button 
    android:id="@+id/submit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Submit" 
    /> 

row.xml

<TextView 
    android:id="@+id/label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:layout_toRightOf="@+id/check" 
    android:textSize="20sp" > 
</TextView> 

<CheckBox 
    android:id="@+id/check" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="4dip" 
    android:layout_marginRight="10dip" 
    android:focusable="false" 

    android:focusableInTouchMode="false" > 
</CheckBox> 

<RadioGroup 
    android:id="@+id/radioSex" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:orientation="horizontal" > 

    <RadioButton 
     android:id="@+id/to" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:checked="true" 
     android:text="To" /> 

    <RadioButton 
     android:id="@+id/cc" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:text="CC" /> 
</RadioGroup> 

MyAdaptor.java

public class MyAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

    public MyAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) convertView 
        .findViewById(R.id.check); 

      viewHolder.checkbox 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          int getPosition = (Integer) buttonView.getTag(); 
          list.get(getPosition).setSelected(
            buttonView.isChecked()); 
         } 
        }); 
      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.label, viewHolder.text); 
      convertView.setTag(R.id.check, viewHolder.checkbox); 

     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.checkbox.setTag(position); 

     viewHolder.text.setText(list.get(position).getName()); 
     viewHolder.checkbox.setChecked(list.get(position).isSelected()); 

     return convertView; 
    } 

MainActivity.java

public class MainActivity extends Activity implements OnItemClickListener { 

    ListView listView; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 

    private RadioGroup radioCcToGroup; 
    private RadioButton radioTypeButton; 
    private Button btn; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     listView = (ListView) findViewById(R.id.my_list); 

     btn = (Button) findViewById(R.id.submit); 

     btn.setOnClickListener(new View.OnClickListener() { 
      int count = 0; 

      @Override 
      public void onClick(View view) { 


       count = listView.getAdapter().getCount(); 
       for (int i = 0; i < count; i++) { 
        // here i am not able to get the records as getting on onItemClick of the listview 
       } 
      } 
     }); 

     adapter = new MyAdapter(this, getModel()); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
     TextView label = (TextView) v.getTag(R.id.label); 
     CheckBox checkbox = (CheckBox) v.getTag(R.id.check); 
     Toast.makeText(v.getContext(), 
       label.getText().toString() + " " + isCheckedOrNot(checkbox), 
       Toast.LENGTH_LONG).show(); 

    } 

    private String isCheckedOrNot(CheckBox checkbox) { 
     if (checkbox.isChecked()) 
      return "is checked"; 
     else 
      return "is not checked"; 
    } 

    private List<Model> getModel() { 
     list.add(new Model("Linux")); 
     list.add(new Model("Windows7")); 
     list.add(new Model("Suse")); 
     list.add(new Model("Eclipse")); 
     list.add(new Model("Ubuntu")); 
     list.add(new Model("Solaris")); 
     list.add(new Model("Android")); 
     list.add(new Model("iPhone")); 
     list.add(new Model("Java")); 
     list.add(new Model(".Net")); 
     list.add(new Model("PHP")); 
     return list; 
    } 

Model.java

private String name; 
    private boolean selected; 

    public Model(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

risposta

8

You Got 2 errori qui sia sul MyAdaptor.java:

  1. Quando si collega il onCheckedChangeListener lo si fa solo quando una nuova vista deve essere creato e dimentichi il caso in cui la vista elenco riutilizza la vista. È necessario setOnCheckedChangeListener fuori if (convertView == null).

  2. Sembra che onCheckedChangeListener venga chiamato anche quando lo scorrimento è terminato (a causa di viewHolder.checkbox.setChecked(list.get(position).isSelected());). È possibile evitare questo utilizzando OnClickListener su viewHolder.checkbox o non chiamando viewHolder.checkbox.setChecked().

Ecco il mio codice:

private class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
    protected RadioGroup radioGroup; 
} 

public class MyAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

    public MyAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row, null); 

      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
      viewHolder.checkbox.setTag(position); 
      viewHolder.radioGroup = (RadioGroup) convertView.findViewById(R.id.radioSex); 
      viewHolder.radioGroup.setTag(position); 

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

     viewHolder.text.setText(list.get(position).getName()); 
     viewHolder.checkbox.setChecked(list.get(position).isSelected()); 
     viewHolder.checkbox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CheckBox checkbox = (CheckBox) v; 
       int getPosition = (Integer) checkbox.getTag(); 
       list.get(getPosition).setSelected(checkbox.isChecked()); 
      } 
     }); 

     viewHolder.radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       boolean isCcOrIsTo = (checkedId == R.id.cc); 
       int getPosition = (Integer) group.getTag(); 
       list.get(getPosition).setCcOrIsTo(isCcOrIsTo); 
      } 
     }); 

     return convertView; 
    } 
} 

Avviso ho aggiunto un po 'di controllo sulla RadioGroup anche, in modo Model.java è cambiato:

public class Model { 

    private String name; 
    private boolean selected; 
    private boolean isCcOrIsTo; 

    public Model(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

    public boolean isCcOrIsTo() { 
     return isCcOrIsTo; 
    } 

    public void setCcOrIsTo(boolean isCcOrIsTo) { 
     this.isCcOrIsTo = isCcOrIsTo; 
    } 

    @Override 
    public String toString() { 
     String selectedString = selected ? "selected" : "not selected"; 
     String value = isCcOrIsTo ? "CC" : "To"; 
     return name+" -> "+selectedString+ " with value "+value; 
    } 
} 

Infine don 'necessario onItemClick su MainActivity.java, per verificare se i valori sono corretti quando si fa clic sul pulsante di vertice:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.my_list); 

    btn = (Button) findViewById(R.id.submit); 

    btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      for (Model m : list) { 
       Log.i("Stack1", m.toString()); 
      } 
     } 
    }); 

    ArrayAdapter<Model> adapter = new MyAdapter(this, getModel()); 
    listView.setAdapter(adapter); 
} 

speriamo vi sia utile;)

+0

Grazie, @Kalem, ma ancora se ho scorrere ListView ottiene automaticamente selezionato. Se non seleziono alcuna opzione di pulsante di opzione e quindi lo scorrimento non sta effettuando ma, nel caso in cui selezionarne uno. – subodh

+0

Strano, non ho avuto questo problema quando ho provato, lo guarderò ancora una volta. Per essere chiari, hai sostituito 'setOnCheckedChangeListener'? Puoi anche fare il checkout se non proviene da: 'viewHolder.checkbox.setChecked (list.get (posizione) .isSelected());' – Kalem

+0

Mi limito a copiare e incollare il tuo codice ma in caso di check box funziona bene anche io ho ottenuto tutte le risposte correttamente. ma quando seleziono uno qualsiasi dei pulsanti di scelta e scorri, seleziona più di un pulsante di opzione nell'interfaccia utente, ma quando invio la pagina mostra solo ciò che è previsto, ma nell'interfaccia utente viene mostrato come multiplo. – subodh