web-dev-qa-db-ja.com

独自のカスタムアダプターを作成する場合、getView()メソッドはどのように機能しますか?

私の質問は:

  1. LayoutInflaterの正確な機能は何ですか?
  2. Convertviewが最初にnullであるかどうかを、私が読んだすべての記事で確認するのはなぜですか? nullの場合はどういう意味で、nullでない場合はどういう意味ですか?
  3. このメソッドが受け入れる親パラメーターは何ですか?
98
GrowinMan

1: LayoutInflater は、レイアウトXMLファイルを取得し、そのコンテンツから異なるViewオブジェクトを作成します。

2:アダプターは、ビューを再利用するために構築されています。ビューがスクロールされて表示されなくなった場合、表示される新しいビューの1つに使用できます。この再利用されたビューはconvertViewです。これがnullの場合、リサイクルされたビューがないことを意味し、新しいビューを作成する必要があります。そうでない場合は、新しいビューの作成を避けるために使用する必要があります。

3:parentが提供されているため、ビューを適切なレイアウトパラメーターに拡張できます。

これらすべてを一緒に使用して、リストに表示されるビュー(またはアダプターを使用する他のビュー)を効果的に作成できます。

public View getView (int position, View convertView, ViewGroup parent){
    if( convertView == null ){
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}

LayoutInflaterの使用、parentを引数として使用できること、およびconvertViewの再利用方法に注意してください。

115
Jave

getView() アダプタのメソッドは、ListViewGallery、...のアイテムのビューを生成するためのものです.

  1. LayoutInflaterは、レイアウトxmlで定義するViewオブジェクトを取得するために使用されます(ルートオブジェクト、通常LinearLayoutFrameLayout 、またはRelativeLayout

  2. convertViewはリサイクル用です。一度に10個のアイテムしか表示できないリストビューがあり、現在アイテム1->アイテム10が表示されているとします。1つのアイテムを下にスクロールすると、アイテム1が画面外になり、アイテム11が表示されます。アイテム11のビューを生成するために、getView()メソッドが呼び出されます。ここでconvertViewはアイテム1のビューです(これはもう必要ありません)。代わりに、アイテム11(高価な)の新しいViewオブジェクトを作成し、convertViewを再利用しないのはなぜですか? =>新しい変数を作成する場合はconvertViewがnullかどうかを確認し、そうでない場合はconvertViewを再利用します。

  3. parentViewは、 getView() が生成するアイテムのビューを含むListViewまたはGallery ...です。

:このメソッドを直接呼び出すのではなく、親ビューにアイテムのビューを生成する方法を伝えるために実装する必要があります。

67
Anh Tuan

リストビューについては、このビデオをご覧ください。昨年からGoogle IOであり、今でもリストビューに関する最良のウォークスルーです。

http://www.youtube.com/watch?v=wDBM6wVEO7

  1. レイアウト(res/layout /フォルダーのxmlファイル)をLinearLayoutやその他のビューなどのJavaオブジェクトに拡張します。

  2. 新しいオブジェクトの作成とリストのスクロール速度の低下を避けるために、ビデオを見てください。変換ビューの使用法、基本的には再利用されるのを待っているリサイクルビューの最新情報が得られます。

  3. アダプタからリストビューを参照できます。

8
erbsman

LayoutInflaterの正確な機能は何ですか?

XMLを使用して設計する場合、すべてのUI要素は単なるタグとパラメーターです。これらのUI要素(TextViewやLinearLayoutなど)を使用する前に、これらのxml要素に対応する実際のオブジェクトを作成する必要があります。それがインフレータの目的です。インフレータは、これらのタグと対応するパラメーターを使用して、実際のオブジェクトを作成し、すべてのパラメーターを設定します。この後、findViewById()を使用してUI要素への参照を取得できます。

Convertviewが最初にnullであるかどうかを、私が読んだすべての記事で確認するのはなぜですか? nullの場合はどういう意味で、nullでない場合はどういう意味ですか?

これは興味深いものです。ご覧のとおり、リスト内のアイテムが描画されるたびにgetView()が呼び出されます。ここで、アイテムを描画する前に、アイテムを作成する必要があります。これで、convertViewは基本的に、アイテムを描画するために最後に使用されたビューです。 getView()では、最初にxmlをインフレートし、次にfindByViewID()を使用してlistitemのさまざまなUI要素を取得します。 (convertView == null)をチェックするときは、ビューがnull(最初のアイテム)である場合、それを作成するか、それが既に存在する場合は再利用し、再度インフレートプロセスを実行する必要がないことを確認します。はるかに効率的になります。

また、getView()でViewHolderの概念に出会ったに違いありません。これにより、リストがより効率的になります。ビューホルダーを作成し、膨張後に取得したすべてのUI要素への参照を保存します。これにより、多数のfindByViewId()の呼び出しを回避し、多くの時間を節約できます。このViewHolderは(convertView == null)条件で作成され、setTag()を使用してconvertViewに保存されます。 elseループでは、getView()を使用して取得し、再利用します。

このメソッドが受け入れる親パラメーターは何ですか?

親は、getView()によって作成されたビューが最終的にアタッチされるViewGroupです。これで、あなたの場合、これはListViewになります。

お役に立てれば :)

5
Shubhayu
  1. レイアウトインフレータは、現在のビューに外部XMLを拡張/追加します。

  2. getView()は、スクロール時を含め、何度も呼び出されます。したがって、既にビューが膨らんでいる場合、膨らませることはコストのかかるプロセスであるため、再度行う必要はありません。

  3. 親ビューは、リストの単一のセルです。

4
ngesh

LayoutInflaterは、ListViewアイテムまたはフラグメントのonCreateView内のXMLの動的ビューを生成するために使用されます。

ConvertViewは基本的に、現在ビューにないビューをリサイクルするために使用されます。スクロール可能なListViewがあるとします。下または上にスクロールすると、convertViewはスクロールされたビューを示します。この再利用により、メモリが節約されます。

getView()メソッドの親パラメーターは、listViewを持つ親レイアウトへの参照を提供します。使用できる親XML内のアイテムのIDを取得するとします。

ViewParent nv = parent.getParent();

while (nv != null) {

    if (View.class.isInstance(nv)) {
        final View button = ((View) nv).findViewById(R.id.remove);
        if (button != null) {
            // FOUND IT!
            // do something, then break;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Remove", "Remove clicked");

                    ((Button) button).setText("Hi");
                }
            });
        }
        break;
    }

 }
2
user936414

getView()メソッドは、ViewまたはSpinnerの各行に新しいViewGroupまたはListviewを作成します。このViewまたはViewGroupLayout XMLフォルダーのres/layoutファイルで定義し、Adapterクラスオブジェクトへの参照を提供できます。

アダプタに渡された配列に4つのアイテムがある場合。 getView()メソッドは、Adaperの4行に対して4つのビューを作成します。

LayoutInflaterクラスには、XMLリソースレイアウトからビューオブジェクトを作成するメソッドinflate()があります。

1
Ravi1187342

また、Adapter.JavaファイルのAdapterインターフェースでgetViewに関する有用な情報を見つけることができます。それは言います;

    /**
 * Get a View that displays the data at the specified position in the data set. You can either
 * create a View manually or inflate it from an XML layout file. When the View is inflated, the
 * parent View (GridView, ListView...) will apply default layout parameters unless you use
 * {@link Android.view.LayoutInflater#inflate(int, Android.view.ViewGroup, boolean)}
 * to specify a root view and to prevent attachment to the root.
 * 
 * @param position The position of the item within the adapter's data set of the item whose view
 *        we want.
 * @param convertView The old view to reuse, if possible. Note: You should check that this view
 *        is non-null and of an appropriate type before using. If it is not possible to convert
 *        this view to display the correct data, this method can create a new view.
 *        Heterogeneous lists can specify their number of view types, so that this View is
 *        always of the right type (see {@link #getViewTypeCount()} and
 *        {@link #getItemViewType(int)}).
 * @param parent The parent that this view will eventually be attached to
 * @return A View corresponding to the data at the specified position.
 */
View getView(int position, View convertView, ViewGroup parent);
0
Hamza Polat