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/
/***
* 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>
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