Nicholas Key Nicholas Key - 3 months ago 21
Android Question

Dynamic ListView in Android app

Is there a working example out there that demonstrates how to append additional rows in ListView dynamically?
For example:

  1. you are pulling RSS feeds from
    different domains

  2. you then display the first 10 items
    in the ListView (while you have
    other threads running in the
    background continue pulling feeds)

  3. you scroll and reach the bottom of
    the List and click at a button to
    view more items

  4. the ListView will then get appended
    with additional 10 items, which
    makes 20 items now in total.

Any advice how to accomplish this?



To add new item to your list dynamically you have to get adapter class from your ListActivity and simply add new elements. When you add items directly to adapter, notifyDataSetChanged is called automatically for you - and the view updates itself.

You can also provide your own adapter (extending ArrayAdapter) and override the constructor taking List parameter. You can use this list just as you use adapter, but in this case you have to call adapter.notifyDataSetChanged() by yourself - to refresh the view.
Please, take a look at the example below:

public class CustomList extends ListActivity {
private LayoutInflater mInflater;
private Vector<RowData> data;

/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    data = new Vector<RowData>();
    RowData rd = new RowData("item1", "description1");
    rd = new RowData("item2", "description2");
    rd = new RowData("item2", "description3");

    CustomAdapter adapter = new CustomAdapter(this, R.layout.custom_row,, data);

public void onListItemClick(ListView parent, View v, int position, long id) {
    CustomAdapter adapter = (CustomAdapter) parent.getAdapter();
    RowData row = adapter.getItem(position);        
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(row.mDescription + " -> " + position );
    builder.setPositiveButton("ok", null);;

 * Data type used for custom adapter. Single item of the adapter.      
private class RowData {
    protected String mItem;
    protected String mDescription;

    RowData(String item, String description){
        mItem = item;
        mDescription = description;         

    public String toString() {
        return mItem + " " +  mDescription;

private class CustomAdapter extends ArrayAdapter<RowData> {

    public CustomAdapter(Context context, int resource,
            int textViewResourceId, List<RowData> objects) {
        super(context, resource, textViewResourceId, objects);


    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        //widgets displayed by each item in your list
        TextView item = null;
        TextView description = null;

        //data from your adapter
        RowData rowData= getItem(position);

        //we want to reuse already constructed row views...
        if(null == convertView){
            convertView = mInflater.inflate(R.layout.custom_row, null);
            holder = new ViewHolder(convertView);
        holder = (ViewHolder) convertView.getTag();
        item = holder.getItem();

        description = holder.getDescription();      

        return convertView;

 * Wrapper for row data.
private class ViewHolder {      
    private View mRow;
    private TextView description = null;
    private TextView item = null;

    public ViewHolder(View row) {
        mRow = row;

    public TextView getDescription() {
        if(null == description){
            description = (TextView) mRow.findViewById(;
        return description;

    public TextView getItem() {
        if(null == item){
            item = (TextView) mRow.findViewById(;
        return item;


You can extend the example above and add "more" button - which just add new items to your adapter (or vector).