A dynamic list of items with SimpleAdapter

2 votes · 1 comment

An activity where by pressing a button on the screen you can update the list with an additional value from the edit text field. A full example is available here: http://github.com/novoda/android/tree/master/DynamicListItems/

raw ·
copy
· download
/*** * DynamicListItems.java * public class DynamicListItems extends ListActivity { private static final String ITEM_KEY = "key"; ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); private SimpleAdapter adapter; private EditText newValue; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dynamic_list); newValue = (EditText) findViewById(R.id.new_value_field); this.adapter = new SimpleAdapter(this, list, R.layout.row, new String[] { ITEM_KEY }, new int[] { R.id.list_value }) setListAdapter(this.adapter); ((ImageButton) findViewById(R.id.button)).setOnClickListener(getBtnClickListener()); } private OnClickListener getBtnClickListener() { return new OnClickListener() { public void onClick(View view) { try { HashMap<String, String> item = new HashMap<String, String>(); item.put(ITEM_KEY, newValue.getText().toString()); list.add(item); adapter.notifyDataSetChanged(); } catch (NullPointerException e) { Log.i("[Dynamic Items]", "Tried to add null value"); } } }; } } /*** * res/layout/dynamic_list.xml * <?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/android:list" android:layout_width="fill_parent" android:layout_height="0px" android:layout_weight="1" android:cacheColorHint="#00000000"> </ListView> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6px" android:layout_marginBottom="8px" android:layout_marginLeft="8px" android:layout_marginRight="8px" android:background="#00000000"> <ImageButton android:id="@+id/button" android:layout_width="100px" android:layout_height="100px" android:src="@android:drawable/ic_menu_add" /> </LinearLayout> <LinearLayout android:orientation="vertical" android:layout_width="230px" android:layout_height="wrap_content" android:layout_marginTop="8px" android:layout_marginBottom="8px" android:layout_marginLeft="0px" android:layout_marginRight="28px" android:background="#cccccc00" > <EditText android:id="@+id/new_value_field" android:textColor="#020905" android:textSize="18sp" android:layout_marginTop="6px" android:layout_marginBottom="8px" android:layout_marginLeft="12px" android:layout_marginRight="12px" android:layout_width="210px" android:layout_height="wrap_content" android:layout_weight="1"/> </LinearLayout> </LinearLayout> /*** * res/layout/row.xml * <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#00000000"> <TextView android:id="@+id/list_value" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
Add a comment

1 Comment

Hi,

Thanks for this tutorial, but this is conforming to the javadoc, I was able to do it without this example, where it blocks is when you want to assign a click listener to the componenent "list_value"!

I've tried two approches:

the first is to get list children by index (getChildAt(i)), te problem is that all of them are null even after calling notifyDataSetChanged();

The second is to force item views creation: when I attemp to force the view creation: for(i=0; i<childrenCount,i++) { final View view = adapter.getView(i, null, listView);
//bind my listener to views here }
Then it does nothing on click : views don't seem bind automatically on creation to the list...

Can you show us how to do please.

Best Regards, Zied Hamdi

Reply · Aug. 3, 2009, 6:19 p.m.