web-dev-qa-db-ja.com

オブジェクトの配列リストからリストビューを作成します

オブジェクトのarraylistからのデータとともに、名前と住所のリストを表示するリストアクティビティがあります。ここまでがリストビューを満たす方法です。

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

人物クラスには、人物の名前と住所が格納されます。

public class Person {
   String name;
   String address;
}

リストビューのリストアイテムは、次のように2つのテキストビューで構成されていますが、

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

リストビューの各アイテムに各人の名前と住所の両方を表示したい。誰か助けてくれますか?

事前に感謝し、私の悪い英語を申し訳ありません...

22
djargonforce

アクティビティ内

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

//then populate myListItems  

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

アダプター

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

これがカスタムリストアダプターの問題に対する私の解決策です。最初にカスタム配列アダプター:

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

}

アクティビティのonCreateメソッドで:

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

そして、私はこのような呼び出しでいくつかのフェッチ後にアダプタを埋めます:

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

したがって、これをソリューションに適合させるには、独自のカスタムアダプターを作成し、オブジェクトMemoEntryの代わりにPersonクラスを使用します。 getViewメソッドで、ニーズに合わせて変更します。それは私がやっていることとほぼ同じで、それほど難しくないはずです。

これが少しお役に立てば幸いです!

2
aeliusd