6

Estoy creando una aplicación para Android con la interfaz de usuario de mi aplicación a continuación.Listview con Checkbox, RadioButton, Textview y el botón no funciona correctamente en android

Al hacer clic en el botón Enviar, necesito la casilla de verificación seleccionada y el valor de los botones de opción.

Ejemplo Linux no está marcado, cc (botón de opción) está marcado.

Los registros se llenan dinámicamente en la vista de lista, pero no puedo hacerlo funcionar. Muchos problemas con están ahí.

  1. Cuando me desplazo por la vista de lista, el botón de opción se selecciona automáticamente o se desactiva si no se puede mantener el estado del botón de opción.
  2. Al hacer clic en el botón, no se obtiene el botón de opción seleccionado, sino también la casilla de verificación.

A continuación se muestra mi diseño, así como el programa de Java. Sugiérame que obtenga los valores correctos.

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; 
    } 

Respuesta

8

Usted tiene 2 errores aquí, tanto en su MyAdaptor.java:

  1. Cuando une el onCheckedChangeListener lo hace sólo cuando un nuevo punto de vista tiene que ser creado y olvida el caso en que la vista de lista reutiliza la vista. Debe setOnCheckedChangeListener fuera de if (convertView == null).

  2. Parece que onCheckedChangeListener se invoca también cuando se realiza el desplazamiento (debido a viewHolder.checkbox.setChecked(list.get(position).isSelected());). Puede evitar esto usando OnClickListener sobre viewHolder.checkbox o no llamando al viewHolder.checkbox.setChecked().

Aquí está mi código:

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; 
    } 
} 

Aviso que he añadido algo de control sobre la radiogroup también, así Model.java ha cambiado:

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; 
    } 
} 

Por último, Don No necesita onItemClick en MainActivity.java, para verificar si los valores son correctos cuando hace clic en el botón de cumbre:

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); 
} 

creo que sirve;)

+0

Gracias, @Kalem, pero aún si me desplazo la vista de lista que es seleccionado automáticamente. Si no selecciono ninguna opción de botón de radio y luego no funciona el desplazamiento, en caso de que seleccione alguno de ellos. – subodh

+0

Extraño, no tuve ese problema cuando lo probé, lo echaré un vistazo una vez más. Para que quede claro, ¿reemplazó el 'setOnCheckedChangeListener'? También puede verificar si no viene de: 'viewHolder.checkbox.setChecked (list.get (position) .isSelected());' – Kalem

+0

Copie y pegue su código, pero en el caso de la casilla de verificación, funciona bien incluso obtuve toda la respuesta correctamente. pero cuando selecciono cualquiera de los botones de opción y desplazamiento, selecciono más de un botón de opción en la interfaz de usuario, pero cuando envío la página muestra solo lo que se espera, pero en la interfaz de usuario se muestra múltiple como está marcado. – subodh

Cuestiones relacionadas