2011-06-24 4 views
0

ArrayAdapter <T>を使用して、複数項目の行レイアウトを表示する必要があるのは初めてです。さまざまなアダプターでうまくいくと、これが私を狂ってしまう。どのように複雑なレイアウトでArrayAdapter <T>を使用しますか?

getView(...、position、...)は常に0-7 [EDIT]を返しますので、ArrayList内の> 7 [/ EDIT]にある要素は表示されません。私は知っている、これは目に見える位置ですが、どのようにArrayList内の正しいオブジェクトを選択するのですか?

EDIT:現在のところ、配列の最初の8つの要素は、配列の0から7までしかないため、配列要素の50個の要素でも取得できます。私は "実際の"位置なしでArrayList内に配置する方法を見ていない。

ドキュメントは次のように言っていますが、私はそれを理解しません。誰かが複雑なレイアウトを持つArrayAdapter <T>を正常に実装しましたか?ドクッとは何を意味し、どのように実装すればよいですか?

あなたは、より複雑な レイアウトを使用したい場合は、また は、フィールドIDを取るコンストラクタを使用しています。そのフィールドIDは より大きい レイアウトリソースのTextViewを参照する必要があります。ただし、TextView が参照されると、 配列内の各オブジェクトのtoString()が で埋められます。 カスタムオブジェクトのリストまたは配列を追加できます。オブジェクトの のtoString()メソッドをオーバーライドして リストに表示されるテキストを決定します。 例えば、 配列の表示のためにTextViews以外 ものを使用 ImageViews、またはのtoString以外のデータ のいくつかを持っている()の結果は 意見を記入し、型を返すためにgetViewメソッド(int型、ビュー、 のViewGroup)を上書きするにはビュー が必要です。事前に

感謝

hjw

ここでのコードは、これまでのところです:

public class HappyAdapter extends ArrayAdapter<Happy> { 

    static class ViewHolder { 
    private ImageView imageView; 
    private TextView textViewBottom; 
    private TextView textViewTop; 
    } 

    private ArrayList<Happy> arrayListHappy; 
    private DrawableCache drawableCache = DrawableCache.getInstance(); 
    private int    layout; 

    @Override 
    public int getCount() { 
    return arrayListHappy.size(); 
    } 

    @Override 
    public View getView(int position, View contentView, ViewGroup viewGroup) { 
    // position always 0-7 

    View  view = null; 
    ViewHolder viewHolder = null; 

    if (contentView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(layout, null); 

     if (view != null) { 
     viewHolder = new ViewHolder(); 
     viewHolder.imageView = (ImageView) view.findViewById(R.id.happyactivity_row_image_left); 
     viewHolder.textViewBottom = (TextView) view.findViewById(R.id.happyactivity_row_text_bottom); 
     viewHolder.textViewTop = (TextView) view.findViewById(R.id.happyactivity_row_text_top); 
     view.setTag(viewHolder); 
     } 
    } else { 
     view = contentView; 
     viewHolder = (ViewHolder) contentView.getTag(); 
    } 

    if (viewHolder != null) { 
     Happy happy = arrayListHappy.get(position); 
     if (happy != null) { 
     viewHolder.imageView.setUrl(happy.getImageThumbnail()); 
     drawableCache.fetchDrawable(happy.getImageThumbnail(), viewHolder.imageView); 
     viewHolder.textViewBottom.setText(String.valueOf(position)); 
     viewHolder.textViewTop.setText(String.valueOf(viewHolder.position)); 
     } 
    } 

    return view; 
    } 

    public HappyAdapter(Context context, int layout, ArrayList<Happy> arrayListHappy) { 
    super(context, layout, arrayListHappy); 

    this.arrayListHappy = arrayListHappy; 
    this.layout = layout; 
    } 
} 

これが行レイアウトの一部です:

<?xml version="1.0" encoding="utf-8"?> 

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

    <ImageView 
    android:id="@+id/happyactivity_row_image_left" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:layout_width="fill_parent" /> 

    <TextView 
    style="@style/TextViewStandard" 
    android:id="@+id/happyactivity_row_text_top" 
    android:layout_weight="1" /> 

    <TextView 
    style="@style/TextViewStandard" 
    android:id="@+id/happyactivity_row_text_bottom" 
    android:layout_weight="1" /> 
    </LinearLayout> 
</LinearLayout> 
+0

どの部分が機能していませんか? – CaseyB

+0

より大きい場合でも、私はArrayListから要素0-7を見るだけです。私は元の投稿にその部分を編集しました。 –

答えて

2

私がすることができますまだコメントを追加する必要はありません。他の人が指摘しているように、うまくいかないことは明らかではありません。しかし、あなたがあなた自身を指摘したように、現在表示されているリストの唯一の部分であるため、位置0-7が膨張しているのが見えています。リストを下にスクロールするまで、他の行(高い位置番号を持つ)は膨張しません。

使用しているArrayAdapterではなく、BaseAdapterクラスを使用していますが、ApiDemosサンプルコード(ApiDemos/src/com/example/android/apis/view/List14.java)でList14.javaを見ることができます。原則は同じです。 ArrayAdapterを使用する場合、このサンプルコードが行うすべてのメソッドをオーバーライドする必要はありません(getViewのみ)。

+0

絶対に正しい。必要なメソッドのみをオーバーライドします。 – Spidy

+0

ArrayListが大きい場合でも、スクロールダウン位置は0〜7のままです。 –

+0

これで動作します。ありがとう。私は何をしたのか分かりません。一日中の変化の1つは、ViewHolderに位置を格納し、happyAdapter.get(position)の代わりにhappyAdapter.get(viewHolder.position)を使用することでした。 –

関連する問題