2016-06-15 1 views
1

私はListViews用のカスタムArrayAdaptersをちょっと混乱させてきました。それらを拡張するとき、私は常にリソース引数として-1(存在しないリソースID)をsuperに渡しました。 getViewをオーバーライドするときに、他のものを渡すことに潜在的な利点がありますか?ArrayAdapterを拡張してgetViewをオーバーライドするとき、resource/textViewResourceId引数を完全に冗長に渡していますか?

答えて

1

getViewをオーバーライドすると、他の場所を通過する可能性はありますか?

確かに。実際のレイアウトとTextViewリソースIDを渡した場合は、super.getView()メソッドでViewのインフレーションを処理し、単一のTextViewにテキストを割り当てることができます。次に、getView()オーバーライドは「空白を埋める」必要があります。

public class Item { 
    String text; 
    int imageResId; 

    public Item(String text, int imageResId) { 
     this.text = text; 
     this.imageResId = imageResId; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 
} 

そしてそうのような単純な項目のレイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical"> 

    <ImageView android:id="@+id/item_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView android:id="@+id/item_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

そして、私たちのArrayAdapterサブクラスは、単純にこの可能性が例えば

は、我々は次のような単純なリスト項目のクラスを持っていると言います

public class MyAdapter extends ArrayAdapter<Item> { 
    public MyAdapter(Context context, List<Item> items) { 
     super(context, R.layout.list_item, R.id.item_text, items); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     ((ImageView) v.findViewById(R.id.item_image)) 
      .setImageResource(getItem(position).imageResId); 

     return v; 
    } 
} 

toString()のオーバーライドを01に実装していますクラスは、正しいStringArrayAdapterを提供します。

+0

これは私の最初の考えでもありました。すぐに試しましたが、super.getViewを無視しました。非常によくカップルの行を削除することができます例を一緒に入れて、ありがとう:) –

+1

問題はありません。コンストラクタで無効なレイアウトリソースを渡した場合、 'super.getView()'を呼びたくない場合は、 'Resources $ NotFoundException'を取得します。 –

1
super(context, R.layout.list_item_layout, R.id.item_text_inside_layout, items); 

第3のパラメータは、ListView/Gridviewのカスタムレイアウトを使用する場合に便利です。

ArrayAdapterを使用して、Object.toString()を使用して、Listviewの各項目の値を取得します。表示するTextViewが必要です。したがって、3つのオプションがあります。

  1. テキストアイテムのデフォルトレイアウトを使用します。 like android.R.layout.simple_list_item_1

  2. テキストアイテムにカスタムレイアウトを使用し、textViewIdでデータを配置します。 super(context, R.layout.list_item_layout, R.id.item_text_inside_layout, items);

  3. ArrayAdapterではなく、カスタムアダプタを使用してください。 BaseAdapterを拡張して、あなたが望むビューを膨らませることができます

希望すると助かります!

+0

私はdocを見ていて、getViewはArrayAdapterでのみ宣言されていたので、BaseまたはListAdapterが正確にどのように動作したかについて混乱していました。あなたのコメントを見て、ドキュメントを少し掘り下げて、 -doh! - ありがとう、私はもう少しドキュメントをナビゲートするのに慣れる必要があります:) –

関連する問題