web-dev-qa-db-fra.com

Remplir la vue de liste à partir de la liste d'objets

J'ai une activité de liste qui affichera une liste de noms et d'adresses de personnes avec des données de la liste d'objets. voici la méthode pour remplir la liste jusqu'à présent ..

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

La classe de personne est le nom et l'adresse d'une personne.

public class Person {
   String name;
   String address;
}

Alors que mon listitem pour ma listview se compose de deux textview, comme ceci:

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

Je souhaite que chaque élément de ma liste affiche à la fois le nom et l'adresse de chaque personne. Quelqu'un peut-il m'aider?

Merci d'avance et désolé pour mon mauvais anglais ...

22
djargonforce

Dans votre activité

AdapterPerson adbPerson;
ArrayList<Person> myListItems  = new ArrayList<Person>();

//then populate myListItems  

adbPerson= new AdapterPerson (youractivity.this, 0, myListItems);
listview.setAdapter(adbPerson);

adaptateur

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;
    }
}
29
Talha

Ceci est ma solution au problème de l'adaptateur de liste personnalisée. Tout d'abord un adaptateur de tableau personnalisé:

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

}

et dans la méthode onCreate de l'activité:

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);

puis je remplis l'adaptateur après avoir récupéré un appel comme celui-ci:

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

Donc, pour l'adapter à votre solution, créez votre propre adaptateur personnalisé et au lieu de mon objet MemoEntry, utilisez votre classe Person. Dans la méthode getView, modifiez-la en fonction de vos besoins. C'est à peu près la même chose que ce que je fais, cela ne devrait pas être trop difficile.

J'espère que ça vous aide un peu!

2
aeliusd