Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populate listview from arraylist of objects

Tags:

I have a listactivity which will display a list of persons name and address with data from arraylist of objects. here's the method to fill the listview so far..

private void fillData(ArrayList<Person> messages) {
    //populating list should go here
}

The person class is stores name and address of a person.

public class Person {
   String name;
   String address;
}

While my listitem for my listview consist of two textview, like this :

<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
android:clickable="false"
android:paddingBottom="9dp"
android:paddingTop="5dp" >

<TextView
    android:id="@+id/display_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/display_number"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/display_name"
    android:layout_below="@+id/display_name"
    android:textAppearance="?android:attr/textAppearanceSmall" />

I want each item in my listview to displaying both the name and address of each person. Can somebody please help ?

Thanks in advance, and sorry for my bad English...

like image 226
djargonforce Avatar asked Mar 08 '13 15:03

djargonforce


2 Answers

In your activity

AdapterPerson adbPerson; ArrayList<Person> myListItems  = new ArrayList<Person>();  //then populate myListItems    adbPerson= new AdapterPerson (youractivity.this, 0, myListItems); listview.setAdapter(adbPerson); 

Adapter

public class AdapterPerson extends ArrayAdapter<Person> {     private Activity activity;     private ArrayList<Person> lPerson;     private static LayoutInflater inflater = null;      public AdapterPerson (Activity activity, int textViewResourceId,ArrayList<Person> _lPerson) {         super(activity, textViewResourceId, _lProducts);         try {             this.activity = activity;             this.lPerson = _lPerson;              inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          } catch (Exception e) {          }     }      public int getCount() {         return lPerson.size();     }      public Product getItem(Product position) {         return position;     }      public long getItemId(int position) {         return position;     }      public static class ViewHolder {         public TextView display_name;         public TextView display_number;                   }      public View getView(int position, View convertView, ViewGroup parent) {         View vi = convertView;         final ViewHolder holder;         try {             if (convertView == null) {                 vi = inflater.inflate(R.layout.yourlayout, null);                 holder = new ViewHolder();                  holder.display_name = (TextView) vi.findViewById(R.id.display_name);                 holder.display_number = (TextView) vi.findViewById(R.id.display_number);                   vi.setTag(holder);             } else {                 holder = (ViewHolder) vi.getTag();             }                holder.display_name.setText(lProducts.get(position).name);             holder.display_number.setText(lProducts.get(position).number);           } catch (Exception e) {           }         return vi;     } } 
like image 84
Talha Avatar answered Sep 28 '22 04:09

Talha


This is my solution to the custom list adapter problem. First a custom arrayadapter:

public class MemoListAdapter extends ArrayAdapter<MemoEntry> {

private int layoutResourceId;

private static final String LOG_TAG = "MemoListAdapter";

public MemoListAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    layoutResourceId = textViewResourceId;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    try {
        MemoEntry item = getItem(position);
        View v = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            v = inflater.inflate(layoutResourceId, null);

        } else {
            v = convertView;
        }

        TextView header = (TextView) v.findViewById(R.id.list_memo_item_header);
        TextView description = (TextView) v.findViewById(R.id.list_memo_item_text);

        header.setText(item.getHeader());
        description.setText(item.getValue());

        return v;
    } catch (Exception ex) {
        Log.e(LOG_TAG, "error", ex);
        return null;
    }
}

}

and in the onCreate method of the activity:

adapter = new MemoListAdapter(this, R.layout.list_memo_item_layout); // the adapter is a member field in the activity
setContentView(R.layout.activity_view_memo_layout);
ListView lv = (ListView) findViewById(R.id.view_memo_memo_list);
lv.setAdapter(adapter);

and then i fill the adapter after some fetching with a call like this:

ArrayList<MemoEntry> memoList = new ArrayList<MemoEntry>(); //here you should use a list with some content in it
adapter.addAll(memoList);

So to adapt this to your solution, create your own customadapter, and instead of my object MemoEntry, use your Person class. In the getView method, change it to suit your needs. It's about the same as what i'm doing so shouldn't be too hard.

Hope this helps you a bit!

like image 41
aeliusd Avatar answered Sep 28 '22 06:09

aeliusd