EDIT - see comments, this solution may not be correct
I know this question is ancient, but this is the first result on Google, and I am working on an application that uses Spinners in ListView. To get started, I used some sample code here . Hope this example answers your question. I did not implement CheckBox, but they are very similar to Spinner - actually much easier. In this example, there is a ListView with TextView and Spinner. Whenever the user changes the selection in the counter, the TextView changes to reflect this.
I divided this project into 3 classes:
- ListViewTestActivity - Main Activity
- DataAdapter - Extends the ArrayAdapter and works to display items in a ListView
- DataHolder is a simple object that simply contains some information about the element. It can be implemented in many other ways to suit your needs.
There are also 3 key Android XML files that I modified / created:
- main.xml - changed - main layout
- rowview.xml - added - layout for each item in ListView
- strings.xml - modified - Android default settings file
To start from the bottom up, this main.xml file contains only one ListView, and nothing more:
<?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>
And here is rowview.xml. Remember that this view is duplicated for each row in the 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>
The strings.xml file. All I added was an array for the contents of the counter:
<?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>
Now for the fun stuff. Class 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); } }
It's pretty simple, you just get the list, create a new adapter and install the ListView adapter in the one you created. This is the DataHolder class:
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; } }
All DataHolder classes are to hold the Spinner adapter and any other information that you want to save for each entry in the ListView (for example, you might want to keep it checked or not). And finally, the real "meat" of the application, the DataAdapter class:
public class DataAdapter extends ArrayAdapter<DataHolder> { private Activity myContext; public DataAdapter(Activity context, int textViewResourceId, DataHolder[] objects) { super(context, textViewResourceId, objects); myContext = context; }
Here is a screenshot of the final application (this is not very beautiful, but it really works):

And this! I hope I answered your question and helped everyone who came across it like me. If you want to dynamically change the data in the list, use the DataAdapter add() , remove() , get() and set() methods. To change the data for each individual counter, you need to change the DataHolder class. A SpinnerAdapter is created there, so you just need to dynamically generate adapters based on the database response.