web-dev-qa-db-ja.com

リストビューごとに複数のテキストビューがある場合にアダプタを設定するにはどうすればよいですか?

TextViewのリストアイテムごとに複数のListViewsがあります。私は自分が信じている適切なgetViewメソッドを書くことを学びましたが、そのメソッドを呼び出すためにsetAdapterをどのように使用するかわかりません。

private static String[] project = {"proj1","proj2"};
private static String[] workRequests = {"requirement gathering", "design"};
private static String[] startDate = {"02/21/2012","07/15/2011"};
private static String[] status = {"WIP","DONE"};

ListView mListView;

public class MyDashboardActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mydashboard);

        final LayoutInflater mInflater = LayoutInflater.from(this);
        mListView = (ListView)findViewById(R.id.dashboardList);
        mListView.setAdapter(
                // How do I set the adapter?
                );
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("enters");
        if(convertView == null){
            convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null);
        }

        ((TextView) convertView.findViewById(R.id.project)).setText(project[position]);
        ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]);
        ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]);
        ((TextView) convertView.findViewById(R.id.status)).setText(status[position]);

        return convertView;
    }

これはxmlレイアウトです:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/home_root"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <!-- Include Action Bar -->
    <include layout="@layout/actionbar_layout" />

    <ListView
        Android:id="@+id/dashboardList"
        style="@style/LeftHeaderText"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="10dp"
        Android:background="@drawable/innerdashboard_bg"
        Android:textColor="@color/textColor" >

        <TextView Android:id="@+id/project" />

        <TextView Android:id="@+id/work_request" />

        <TextView Android:id="@+id/start_date" />

        <TextView Android:id="@+id/status" />

    </ListView>

</LinearLayout>

私はいくつかの方法を試しましたが、どれもうまくいきませんでした。この場合、アダプターの設定方法を教えてもらえますか?ありがとう!

9
Harsh

独自のアダプタを実装する必要があります。私の方法は、ビューを「表す」オブジェクトも定義することです。

以下に、ニーズに合わせて2つのTextViewsを使用した非常に単純な例を示します。

ビューを表すオブジェクト(ListViewの行):

_public class CustomObject {

    private String prop1; 
    private String prop2;

    public CustomObject(String prop1, String prop2) {
        this.prop1 = prop1;
        this.prop2 = prop2;
    }

    public String getProp1() {
        return prop1;
    }

    public String getProp2() {
       return prop2;
    }
}
_

次に、カスタムアダプタ:

_public class CustomAdapter extends BaseAdapter {

   private LayoutInflater inflater;
  private ArrayList<CustomObject> objects;

   private class ViewHolder {
      TextView textView1;
      TextView textView2;
   }

   public CustomAdapter(Context context, ArrayList<CustomObject> objects) {
      inflater = LayoutInflater.from(context);
      this.objects = objects;
   }

   public int getCount() {
      return objects.size();
   }

   public CustomObject getItem(int position) {
      return objects.get(position);
   }

   public long getItemId(int position) {
      return position;
   }

   public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder = null;
      if(convertView == null) {
         holder = new ViewHolder();
         convertView = inflater.inflate(R.layout.your_view_layout, null);
         holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1);
        holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2);
         convertView.setTag(holder);
      } else {
         holder = (ViewHolder) convertView.getTag();
      }
      holder.textView1.setText(objects.get(position).getprop1());
      holder.textView2.setText(objects.get(position).getprop2());
      return convertView;
   }
}
_

これで、アクティビティでアダプタを定義および設定できます。

_ArrayList<CustomObject> objects = new ArrayList<CustomObject>();
CustomAdapter customAdapter = new CustomAdapter(this, objects);
listView.setAdapter(customAdapter);
_

これで、オブジェクトリストでCustomObjectを管理するだけで済みます。 ListViewで変更を再実行する場合は、customAdapter.notifyDataSetChanged()を呼び出すことを忘れないでください。

18
FabiF

getView()コードは、BaseAdapterまたはそのサブクラスの1つを拡張するクラスに入る必要があります。

これを行う1つの方法は、MyDashboardActivity内にプライベートクラスを作成することです。以下に簡単な例を示します(いくつかの追加コードが必要になります)。また、カスタムオブジェクトを使用して、1つのリストアイテムに表示するすべてのものを関連付けることもできます。複数の配列の代わりに、追跡している値ごとにプロパティを持つカスタムタイプの配列を1つ用意します。

もう1つ、4つのTextViewを独自のレイアウトファイルに入れる必要があります(list_item.xml ここ を参照)。そのアイテムレイアウトファイルは、カスタムアダプターのコンストラクターを介して接続されます(これを強調するために、以下のコードにコメントを追加しました)。

protected CustomAdapter mAdapter;

public class MyDashboardActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mydashboard);

        final LayoutInflater mInflater = LayoutInflater.from(this);
        mListView = (ListView)findViewById(R.id.dashboardList);

        mAdapter = new CustomAdapter(this, <array to be adapted>);
        mListView.setAdapter(mAdapter);
    }

    private class CustomAdapter extends ArrayAdapter<String> {

        protected Context mContext;
        protected ArrayList<String> mItems;

        public CustomAdapter(Context context, ArrayList<String> items) {
            super(context, R.layout.custom_list_item, items); // Use a custom layout file
            mContext = context;
            mItems = items;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("enters");
            if(convertView == null){
                convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null);
            }

            // You'll need to use the mItems array to populate these...
            ((TextView) convertView.findViewById(R.id.project)).setText(project[position]);
            ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]);
            ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]);
            ((TextView) convertView.findViewById(R.id.status)).setText(status[position]);

            return convertView;
        }
    }
}
4
Ben Jakuben

これを行うにはいくつかの方法があります。 2つのレイアウトが含まれている方法を紹介します。1つはListView自体であり、もう1つはリストアイテムごとのテキストの表示方法です。

listset.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical">

    <ListView
        Android:id="@+id/shipMenu"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

</LinearLayout>

listitems.xml(ここに画像を入れることもできます。ここでの考え方はコントロールです)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="horizontal">

    <TextView
        Android:id="@+id/makerID"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="10dp"
        Android:textSize="25dp"/>

</LinearLayout>

上記では、アートワークはまだありませんが、アイコン用のImageViewを追加する予定です(さらにTextViewを追加することもできます)。これが私のカスタムアダプタクラスです。

ListAdapter.Java

class ListAdapter extends ArrayAdapter <String>
{

    public ListAdapter(Context context, String[] values) {

        super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView)
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = LayoutInflater.from(getContext());
        View view = inflater.inflate(R.layout.listitems, parent, false); //same here.

        String text = getItem(position);

        TextView makerID = (TextView) view.findViewById(R.id.makerID);
        makerID.setText(text);

        return view;
    }

}

メインアクティビティファイルセット内

setContentView (R.layout.listset);

そして、これをsetContentView()と同じ括弧で囲んで追加します。

ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString

        ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to.
        lv.setAdapter(adapter);

編集

私はそれが見えるパーティーに少し遅れていますが、多分これは誰かを助けるでしょう。

2
GalacticGhost