2013-03-08 17 views
19

Ich habe eine Listactivity, die eine Liste von Personen Name und Adresse mit Daten aus Arraylist von Objekten angezeigt wird. Hier ist die Methode, um die Listview so weit zu füllen.Füllen Sie Listenansicht von Arraylist von Objekten

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

Die Personenklasse ist speichert Name und Adresse einer Person.

public class Person { 
    String name; 
    String address; 
} 

Während mein listitem für meine Listenansicht von zwei Textview bestehen, wie folgt aus:

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

Ich möchte jedes Element in meinem Listenansicht sowohl den Namen und die Adresse jeder Person angezeigt wird. Kann jemand bitte helfen?

Vielen Dank im Voraus, und sorry für mein schlechtes Englisch ...

+0

Suche in der Google Custom Listview ... – Pragnani

+0

Sie können die 'onCreate' Methode verwenden. In diesem Fall wäre es im Programm verwendbar. – user7275835

Antwort

25

In Ihrer Tätigkeit

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; 
    } 
} 
+0

übrigens, warum der 2. Parameter von AdapterPerson 0 ist? – djargonforce

2

Dies ist meine Lösung für die individuellen Listenadapterproblem. Zuerst wird eine benutzerdefinierte 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; 
    } 
} 

}

und im onCreate Verfahren der Aktivität:

und dann fülle ich den Adapter nach einige mit einem Aufruf wie folgt holen:

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

Um dies an Ihre Lösung anzupassen, erstellen Sie Ihre eigenen CustomAdapter, und anstelle meines Objekts MemoEntry, verwenden Sie Ihre Person-Klasse. Ändern Sie sie in der Methode "getView" entsprechend Ihren Anforderungen. Es ist ungefähr das gleiche wie das, was ich mache, also sollte nicht zu schwer sein.

Hoffe das hilft dir ein bisschen!

Verwandte Themen