0

ArrayAdapterでListViewを作成しました。できます。しかし、アイテムのレイアウトのリソースIDは、Viewパラメータがnullの場合のアダプター定義とgetViewで2回指定する必要がありました。リストアダプタの設定 - リストアイテムのレイアウトリソースをどのように繰り返すことはできませんか?

// --------------------------------------------here is the FIRST use 
lvShows.setAdapter(new ArrayAdapter<TvShow>(this, R.layout.show_row, allKnownShows) { 
    @Override 
    public View getView(int position, final View rowView, ViewGroup parent) { 
     LinearLayout showView; 
     if (rowView == null) { 

      // --------------------------------- here is the SECOND use 
      showView = (LinearLayout) inflater.inflate(R.layout.show_row, parent, false); 
     } 
     else { 
      showView = (LinearLayout) rowView; 
     } 
     ((TextView) showView.getChildAt(0)).setText(time)); 
     ((TextView) showView.getChildAt(1)).setText(name); 
     return showView; 
    } 
}); 

このようなスタイルは、もちろん不快です。親切にアドバイスしてください。私は間違って理解していますが、リソースを一度しか使用できません。

新しいArrayAdapterを作成する場合、レイアウトIDを設定しているので、それを知って何とか使用する必要があります。どうすればそれに達することができますか?それとも、アダプターが自動的にアイテムビューを作成すると思います。繰り返しますが、どうすれば使用できますか?

新しいArrayAdapterを作成するときに、そのリソースでArrayAdapterがどのように処理するのですか?すべてのコンストラクタがアイテムリソースを取得し、このリソースを管理し、それを "手作業で"膨張させます。それは効果的な方法ではありません。

+0

BaseAdapter –

+0

ありがとうございます。私はすでにコードを作業しています。私は美しさのためにお金を払うつもりはないので**とても**。後で、おそらく1〜2ヵ月後に、この別の理由でベースアダプタを試してみることにしますが、ここでは複雑なアイテムをリストに表示する簡単で正しい方法を知りたいと思います。 ArrayAdapterが一番簡単なようです。 – Gangnus

答えて

2

// citation from public class ArrayAdapter<T> 
private View createViewFromResource(int position, View convertView, ViewGroup parent, 
     int resource) { 
    View view; 
    TextView text; 
    if (convertView == null) { 
     view = mInflater.inflate(resource, parent, false); 
    } else { 
     view = convertView; 
    } 

そこで、我々は単にそれを使用する必要があります。

lvShows.setAdapter(new ArrayAdapter<TvShow>(this, 
              R.layout.show_row, 
              R.id.nameField, 
              allKnownShows){ 
public View getView(int position, final View convertView, ViewGroup parent) { 
    LinearLayout showView = (LinearLayout) super.getView(position, convertView, parent); 

    setAnythingForItem(showView); 

    return showView; 
} 

注意:私たちはコンストラクタを変更しました!

ArrayAdapterでは、TextViewなしのアイテムレイアウトを使用できます。しかし、TextView自体でない場合は、この内部TextViewフィールドのIDを3番目のパラメータとしてコンストラクタに渡す必要があります。配列に接続されている配列がString要素を持っている場合は、ArrayAdapterにそれを設定してStringを書き込む必要があります。

TextViewは、文字列ではなくObjectで構成されている配列であれば、実際には必要ない場合でも常に必要です。それ以外の場合は、TextViewであることを示す項目レイアウトをチェックし、そうでない場合はエラーをスローします。

+0

+1私はあなたの解決策を私よりも好む – louiscoquio

+0

今見ているように、それはまったくそうではないという面白いことです。誰もがリソースIDを記憶し、後で「手で」膨張させます。 – Gangnus

+0

アダプタはTextViewを持つ必要がありますが、少し制限があり、結果的にすべてのケースでうまく動作しません。 – louiscoquio

2

あなたはArrayAdapterコンストラクタをオーバーライドし、スーパーを呼び出すことができます。

public ArrayAdapter<T>(Context context, TheDataType data) { 
    super(context, R.layout.show_row, data); 
} 

そしてArrayAdapterのメンバ変数にIDを格納します。アダプタに必要なビューが何であるかをアダプタ "ユーザ"が知るのを避けます。

また、BaseAdapterを使用することもできます。私はArrayAdapterのソースコードに見ていた、そしてそれは、すでにビューの作成については、すべてこのようなものを行い

+0

合意した........ – viv

+0

もちろん、できました。しかし、注意してください、新しいArrayAdapterを作成するとき、私は既にアイテムレイアウトIDを設定しています**。何のために? R.layout.show_rowをスーパーコールに入れます。何のために? 'new TheArrayAdapter (this、allKnownShows);'コンストラクタを呼び出すときに指定する必要がないので、 – Gangnus

+0

です。アダプタは、彼が使用する必要のあるリソースを知っているだけです – louiscoquio

関連する問題