106

私の質問は次のとおりです。

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

9 に答える 9

119

1:LayoutInflaterは、レイアウトXMLファイルを取得し、その内容からさまざまなビューオブジェクトを作成します。

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

3:parentは、適切なレイアウトパラメータのためにビューを膨らませることができるように提供されています。

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

public View getView(int position, @Nullable 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、その再利用方法に注意してください。parentconvertView

于 2012-04-12T08:52:24.163 に答える
72

getView()ListViewAdapter のメソッドは、 、Gallery、...のアイテムのビューを生成するためのものです。

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

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

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

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

于 2012-04-12T08:56:56.683 に答える
8

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

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

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

  2. ビデオを見て、変換ビューの使用方法について最新情報を入手してください。基本的には、新しいオブジェクトを作成してリストのスクロールを遅くするのを避けるために、再利用されるのを待っているリサイクルされたビューです。

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

于 2012-04-12T08:42:55.130 に答える
5

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

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

私が読んだすべての記事で、最初に convertview が 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になります。

お役に立てれば :)

于 2012-04-12T09:15:00.160 に答える
4
  1. レイアウト インフレータは、現在のビューに外部 XML をインフレート/追加します。

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

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

于 2012-04-12T08:44:16.110 に答える
2

LayoutInflaterListViewアイテムまたは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;
    }

 }
于 2012-04-12T08:45:29.947 に答える
1

getView()メソッド create new Viewor ViewGroupfor each row of Listviewor Spinner . これを定義するViewか、フォルダー内ViewGroupLayout XMLファイルで定義し、クラス Objectres/layoutへの参照を与えることができます。Adapter

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

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

于 2012-04-12T08:50:14.343 に答える
0

また、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);
于 2016-12-09T08:27:03.240 に答える