Android Listview con hilandero y una casilla de verificación

Soy un novato para el desarrollo de Android. Estoy tratando de crear una lista que tiene un hilandero, un texto de edición y una casilla de verificación. Los datos para la ruleta y la casilla de verificación provienen de la base de datos. Tengo los siguientes archivos.

NewTransac class which extends ListActivity { private PayDbAdapter mDbHelper; private Spinner paySpinner; private CheckBox mCheckBox; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_transac_listview); mDbHelper = new PayDbAdapter(this); mDbHelper.open(); populatedata(); } private void populatedata() { paySpinner = (Spinner)findViewById(R.id.payerspinner); mCheckBox = (CheckBox)findViewById(R.id.paidforcheckboxname); Cursor mCursor = mDbHelper.fetchAllTransactionValue(); startManagingCursor(mCursor); // Create an array to specify the fields we want to display in the list. String[] from = new String[]{PayDbAdapter.KEY_NAME}; int[] to = new int[]{android.R.id.text1}; int[] cbto = new int[]{R.id.paidforcheckboxname}; // Now create a simple cursor adapter and set it to display SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mCursor, from, to ); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item ); paySpinner.setAdapter(adapter); SimpleCursorAdapter cbAdapter = new SimpleCursorAdapter(this, R.layout.show_new_transac_data, mCursor, from, cbto ); setListAdapter(cbAdapter); } 

La vista de lista xml

 <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:drawSelectorOnTop="false" android:textSize="14sp" /> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/no_friends" android:textSize="14sp" /> <Button android:id="@+id/confirmpay" android:text="@string/confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical|center_horizontal|center"> </Button> 

Ver lista xml lleno

 <TextView style="?android:attr/listSeparatorTextViewStyle" android:text="@string/listSeparatorPay" android:layout_marginTop="5dip" android:layout_marginBottom="5dip" /> <Spinner android:id="@+id/payerspinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="true" android:prompt="@string/selectpayer" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/paytext" /> <EditText android:id="@+id/payamount" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="text" /> <TextView style="?android:attr/listSeparatorTextViewStyle" android:text="@string/listSeparatorPayedFor" android:layout_marginTop="5dip" android:layout_marginBottom="5dip" /> <CheckBox android:id="@+id/paidforcheckboxname" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/paidforamount" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> 

Problem
Tengo múltiples spinners, checkboxes y edittext basados ​​en el número de campos en la base de datos. Veo que no podemos establecer el adaptador para la casilla de verificación como he establecido para el hilandero. Necesito obtener sólo un spinner con un texto de edición y varias casillas de verificación (número total de filas de la base de datos). ¡por favor ayuda!

EDIT – por favor vea comentarios, esta solución puede no ser correcta

Sé que esta pregunta antigua, pero es el primer resultado en Google y estoy trabajando en una aplicación que utiliza Spinners en un ListView también. He utilizado algunos código de ejemplo de aquí para empezar. Espero que este ejemplo responda a su pregunta. No implementé los CheckBox pero son muy similares al Spinner – mucho más fácil, de hecho. Este ejemplo tiene un ListView con un TextView y un Spinner. Cada vez que el usuario cambia una selección en la hiladora, TextView cambia para reflejar esto.

Dividí este proyecto en 3 clases:

  • Actividad principal de ListViewTestActivity
  • DataAdapter: extiende ArrayAdapter y trabaja para mostrar los elementos en el ListView
  • DataHolder – objeto simple que sólo contiene algo de información sobre el elemento. Esto podría implementarse de muchas otras maneras para satisfacer sus necesidades.

También hay 3 archivos clave de Android XML que modifiqué / creé:

  • Main.xml – modified – el diseño principal
  • Rowview.xml – added – el diseño de cada elemento en el ListView
  • Strings.xml – modified – el archivo de cadenas Android predeterminado

Para empezar de abajo hacia arriba, este archivo main.xml sólo contiene un único ListView, y nada más:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/listView1" android:layout_height="match_parent" android:layout_width="match_parent" /> </LinearLayout> 

Y aquí está el archivo rowview.xml. Recuerde que esta vista se duplica para cada fila en el ListView:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:weightSum="1"> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/text" android:layout_weight="0.5" android:textSize="25sp" /> <Spinner android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/spin" android:prompt="@string/choice_prompt" android:layout_weight="0.5" /> </LinearLayout> 

El archivo strings.xml. Todo lo que agregué fue una matriz para el contenido de la hiladora:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, ListViewTestActivity!</string> <string name="app_name">ListViewTest</string> <string name="choice_prompt">Select a choice</string> <string-array name="choices"> <item>Alpha</item> <item>Bravo</item> <item>Charlie</item> </string-array> </resources> 

Ahora para las cosas divertidas. La clase ListViewActivity:

 public class ListViewTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView listView = (ListView) findViewById(R.id.listView1); DataHolder data = new DataHolder(this); DataHolder data1 = new DataHolder(this); DataHolder data2 = new DataHolder(this); DataHolder data3 = new DataHolder(this); DataHolder data4 = new DataHolder(this); DataAdapter d = new DataAdapter(this, R.layout.rowview, new DataHolder[] { data, data1, data2, data3, data4 }); listView.setAdapter(d); } } 

Es bastante simple, sólo tienes la lista, hacer un nuevo adaptador, y establecer el adaptador de ListView a la que hizo. Esta es la clase DataHolder:

 public class DataHolder { private int selected; private ArrayAdapter<CharSequence> adapter; public DataHolder(Context parent) { adapter = ArrayAdapter.createFromResource(parent, R.array.choices, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); } public ArrayAdapter<CharSequence> getAdapter() { return adapter; } public String getText() { return (String) adapter.getItem(selected); } public int getSelected() { return selected; } public void setSelected(int selected) { this.selected = selected; } } 

Todo lo que hace la clase DataHolder es mantener el adaptador del Spinner y cualquier otra información que desee almacenar para cada entrada en el ListView (puede que quiera almacenar si está marcada o no, por ejemplo). Y finalmente la verdadera "carne" de la aplicación, la clase DataAdapter:

 public class DataAdapter extends ArrayAdapter<DataHolder> { private Activity myContext; public DataAdapter(Activity context, int textViewResourceId, DataHolder[] objects) { super(context, textViewResourceId, objects); myContext = context; } // We keep this ViewHolder object to save time. It's quicker than findViewById() when repainting. static class ViewHolder { protected DataHolder data; protected TextView text; protected Spinner spin; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; // Check to see if this row has already been painted once. if (convertView == null) { // If it hasn't, set up everything: LayoutInflater inflator = myContext.getLayoutInflater(); view = inflator.inflate(R.layout.rowview, null); // Make a new ViewHolder for this row, and modify its data and spinner: final ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.text); viewHolder.data = new DataHolder(myContext); viewHolder.spin = (Spinner) view.findViewById(R.id.spin); viewHolder.spin.setAdapter(viewHolder.data.getAdapter()); // Used to handle events when the user changes the Spinner selection: viewHolder.spin.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { viewHolder.data.setSelected(arg2); viewHolder.text.setText(viewHolder.data.getText()); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); // Update the TextView to reflect what's in the Spinner viewHolder.text.setText(viewHolder.data.getText()); view.setTag(viewHolder); Log.d("DBGINF", viewHolder.text.getText() + ""); } else { view = convertView; } // This is what gets called every time the ListView refreshes ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(getItem(position).getText()); holder.spin.setSelection(getItem(position).getSelected()); return view; } } 

Aquí hay una captura de pantalla de la aplicación final (no es muy bonita, pero sí funciona):

AppPic

¡Y eso es! Espero haber respondido a su pregunta y ayudado a cualquier persona que tropezó con él como lo hice. Si desea cambiar dinámicamente los datos de la lista, utilice los métodos add() , remove() , get() y set() del DataAdapter. Para cambiar los datos de cada spinner individual, debe modificar la clase DataHolder. El SpinnerAdapter se crea allí, por lo que sólo necesita generar dinámicamente los adaptadores en función de la respuesta de la base de datos.

Con el fin de hacer cosas como que el trabajo uno tiene que almacenar todos los datos en el adaptador, no en los elementos ListView . Cualquier vista que represente un elemento ListView podría reutilizarse para mostrar otro elemento, haciendo que cualquier dato almacenado en sí mismo fuera irrelevante hasta que los datos correctos se vuelvan a establecer en getView .

  • Cómo agregar encabezados de sección pegajosa en listview?
  • ¿Cómo se muestran 2 vistas en 1 actividad (android)?
  • Barra de Acción de Android Buscar con listview
  • Android ignora el tamaño de la barra de desplazamiento
  • ListView muestra sólo un elemento
  • Deshabilitar listview supercroll en samsung android
  • Widget de Android con ListView no carga elementos correclty
  • Actualizar ListView después de eliminar de la base de datos
  • ¿Crea desplazamiento alfabético fácil en ListView?
  • EditText en ListView sin reciclar entrada
  • ¿Cómo hacer el desplazamiento de ListView más lento cuando se utiliza la función smoothScrollToPosition ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.