58

インターネットで見つけた多くのコード サンプルでcontextは、​​アダプターのコンストラクターで取得されます。

このコンテキストは、メソッドinflaterでビューをインフレートするために使用されますgetView

私の質問は、そのように簡単に取得できるのに、なぜわざわざコンストラクターでコンテキストを取得するのかということです

        LayoutInflater inflater;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(inflater == null){
            Context context = parent.getContext();
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }
            ...
            ...

            return convertView;
        }

また、上記の方法を使用しない理由はありますか?これまでのところ、使用に問題はありませんでした。

4

5 に答える 5

41

コンストラクターでコンテキストを取得すると、(少なくとも) 3 つの利点があります。

  1. 呼び出されるたびにでgetView()はなく、一度だけ実行します。
  2. 必要に応じて、他の目的にも使用できます。
  3. の場合にも機能しparentますnull

ただし、ソリューションに問題がない場合は、それに固執することもできます。

于 2012-08-27T09:08:06.153 に答える
2

ビューをどこかに保存するために使用するクラスを誰かが作成するとしたらどうなるでしょうBaseAdapterか (そして、後で親にアタッチするかもしれません)。この場合parentnull.

それはそれほど大きな問題ではありません。何が良いかを自分で決めてください。

例えば:

public class MockWithAdapter{

    private BaseAdapter mAdapter;

    public MockWithAdapter(BaseAdapter adapter){
        mAdapter = adapter;
    }

    public List<View> mock(){
        int size = mAdapter.getCount();
        List<View> views = new ArrayList(size);
        for(int i=0; i<size; i++)
            views.add(mAdapter.getView(i, null, null));

        return views;
    }
}

そして、このビューで好きなことをすることができます:

MockWithAdapter m = new MockWithAdapter(adapter);
ListView lv = new ListView(context);
for(View v : m.mock)
    lv.addView(v);
于 2012-08-27T07:30:54.747 に答える
0

はい。ただし、ダイアログ アラートなどのアクティビティ参照が必要な場合は、 context reference を使用できません。したがって、コンストラクタは Activity/Fragment の呼び出しからアクティビティ参照を受け取る必要があります。

于 2020-02-18T11:19:53.193 に答える