studio programacion herramientas fundamentos con avanzado aplicaciones android android-listview android-textview radio-group

programacion - manual de android en pdf



ListView con RadioGroup en cada fila (2)

Creo que lo tengo. Cada vez que se desplaza, cambia los valores o sus botones de radio con su

if(isChecked[position]) viewHolder.radioGroup.check(R.id.radiobutton_served); else viewHolder.radioGroup.check(R.id.radiobutton_pending);

Pero estableces un oyente ANTES de llamarlo. Entonces se llama al oyente cada vez.

Pruebe esto en su lugar:

viewHolder.radioGroup.setOnCheckedChangeListener(null); if(isChecked[position]) viewHolder.radioGroup.check(R.id.radiobutton_served); else viewHolder.radioGroup.check(R.id.radiobutton_pending); viewHolder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { // if(isUserChanged[position]) { switch(checkedId) { case R.id.radiobutton_served: System.out.println(" --- radiobutton_served ---"+" position "+position+" isChecked[position] "+isChecked[position]); count--; // countView.setText(DataHelper.getAppropriateCountValue(count)); isChecked[position] = true; break; case R.id.radiobutton_pending: System.out.println(" --- radiobutton_pending ---"+" position "+position+" isChecked[position] "+isChecked[position]); isChecked[position] = false; count++; // countView.setText(DataHelper.getAppropriateCountValue(count)); break; } countView.setText(DataHelper.getAppropriateCountValue(count)); } // isUserChanged[position] = false; } });

Espero que esto te ayudará.

Arriba se muestra mi vista de lista personalizada con TextViews y RadioGroup. En función de si el estado del elemento está "pendiente" o "servido", actualizo los elementos pendientes-TextView (en rojo, en la parte superior). Todo está funcionando como se esperaba, y puedo retener las selecciones de RadioGroup en scroll.

Sin embargo, cuando me desplazo, los elementos pendientes TextView no conservan su valor. Cambia cada vez que la lista se desplaza. Aquí está mi método getView.

public View getView(final int position, View convertView, ViewGroup parent) { System.out.println(" --- position ---"+position+" --- isChecked[position] --- "+isChecked[position]); ViewHolder viewHolder = null; if(convertView == null) { convertView = layoutInflater.inflate(R.layout.order_status_listview_row, null); viewHolder = new ViewHolder(); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder)convertView.getTag(); convertView.setTag(viewHolder); } viewHolder.itemName = (TextView)convertView.findViewById(R.id.textview_order_status_item_name); viewHolder.itemQuantity = (TextView)convertView.findViewById(R.id.textview_order_status_item_quantity); viewHolder.radioGroup = (RadioGroup)convertView.findViewById(R.id.radiogroup_order_status_dialog); // isUserChanged[position] = false; viewHolder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { // if(isUserChanged[position]) { switch(checkedId) { case R.id.radiobutton_served: System.out.println(" --- radiobutton_served ---"+" position "+position+" isChecked[position] "+isChecked[position]); count--; // countView.setText(DataHelper.getAppropriateCountValue(count)); isChecked[position] = true; break; case R.id.radiobutton_pending: System.out.println(" --- radiobutton_pending ---"+" position "+position+" isChecked[position] "+isChecked[position]); isChecked[position] = false; count++; // countView.setText(DataHelper.getAppropriateCountValue(count)); break; } countView.setText(DataHelper.getAppropriateCountValue(count)); } // isUserChanged[position] = false; } }); viewHolder.radioGroup.setOnClickListener(new OnClickListener() { public void onClick(View view) { // isUserChanged[position] = true; } }); viewHolder.itemName.setText(orderList.get(position).getDishName()); viewHolder.itemQuantity.setText(orderList.get(position).getDishQuantity()); // change selection state for item checked when selection for radioButton changes if(isChecked[position]) viewHolder.radioGroup.check(R.id.radiobutton_served); else viewHolder.radioGroup.check(R.id.radiobutton_pending); return convertView; }


Dya, hice un pequeño ejemplo.

Mi Activity contiene un TextView y un ListView . ListView está lleno de 20 objetos (RowObject) que tienen su propio diseño (row.xml). El código es bastante directo, por lo que no tendrá problemas para leerlo y entenderlo.

activity_main.xml

<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" > <TextView android:id="@+id/mTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" /> <ListView android:id="@+id/mListView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/mTextView" > </ListView> </RelativeLayout>

row.xml

<LinearLayout 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" > <RadioGroup android:id="@+id/mRadioGroup" android:layout_width="match_parent" android:layout_height="match_parent" > <RadioButton android:id="@+id/mRadio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="radio1" /> <RadioButton android:id="@+id/mRadio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="radio2" /> </RadioGroup> </LinearLayout>

RowObject

public class RowObject { private int ID; private boolean firstChecked; // else second checked public RowObject(int iD, boolean firstChecked) { super(); ID = iD; this.firstChecked = firstChecked; } public boolean isFirstChecked() { return firstChecked; } public void setFirstChecked(boolean firstChecked) { this.firstChecked = firstChecked; } }

Actividad principal

public class MainActivity extends Activity { private TextView mCountTextView; private ArrayList<RowObject> mSource; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSource = new ArrayList<RowObject>(); for (int i = 0; i < 20; i++) { mSource.add(new RowObject(i, false)); } mCountTextView = (TextView) findViewById(R.id.mTextView); ListView mListView = (ListView) findViewById(R.id.mListView); mListView.setAdapter(new RadioButtonAdapter(getApplicationContext(), mSource)); } private class RadioButtonAdapter extends ArrayAdapter<RowObject> { class ViewHolder { RadioGroup rbGroup; RadioButton btn1; RadioButton btn2; } private LayoutInflater mInflater; public RadioButtonAdapter(Context context, ArrayList<RowObject> mSource) { super(context, R.layout.row, mSource); mInflater = LayoutInflater.from(context); } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.row, null); holder = new ViewHolder(); holder.rbGroup = (RadioGroup) convertView.findViewById(R.id.mRadioGroup); holder.btn1 = (RadioButton) convertView.findViewById(R.id.mRadio1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.rbGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.mRadio1: mSource.get(position).setFirstChecked(true); break; case R.id.mRadio2: mSource.get(position).setFirstChecked(false); break; } mCountTextView.setText("There are " + getNumberOfFirstCheckedViews() + " first buttons selected"); } }); if (mSource.get(position).isFirstChecked()) { holder.btn1.setChecked(true); holder.btn2.setChecked(false); } else { holder.btn1.setChecked(false); holder.btn2.setChecked(true); } return convertView; } private int getNumberOfFirstCheckedViews() { int count = 0; for (RowObject object : mSource) { if (object.isFirstChecked()) { count++; } } return count; } } }