私の質問は次のとおりです。
- LayoutInflater の正確な機能は何ですか?
- 私が読んだすべての記事で、最初に convertview が null かどうかを確認するのはなぜですか? null の場合はどういう意味で、そうでない場合はどういう意味ですか?
- このメソッドが受け入れる親パラメーターは何ですか?
私の質問は次のとおりです。
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
、その再利用方法に注意してください。parent
convertView
getView()
ListView
Adapter のメソッドは、 、Gallery
、...のアイテムのビューを生成するためのものです。
LayoutInflater
レイアウト xml で定義した View オブジェクトを取得するために使用されます (ルート オブジェクト、通常はLinearLayout
、
FrameLayout
、またはRelativeLayout
) 。
convertView
リサイクル用です。一度に 10 項目しか表示できないリストビューがあり、現在は項目 1 -> 項目 10 を表示しているとします。項目を 1 つ下にスクロールすると、項目 1 が画面外になり、項目 11 が表示されます。 . アイテム 11 のビューを生成するには、getView() メソッドが呼び出され
convertView
ます。これがアイテム 1 のビューです (これはもう必要ありません)。代わりに、項目 11 の新しい View オブジェクトを作成します (これはコストがかかります) convertView
。=> convertView
null かどうかを確認するだけです。null の場合は新しいビューを作成し、そうでない場合は re-use を使用しますconvertView
。
parentView
getView()
生成するアイテムのビューを含む ListView または Gallery... です。
注: このメソッドを直接呼び出すのではなく、アイテムのビューを生成する方法を親ビューに伝えるために実装する必要があるだけです。
リスト ビューについては、このビデオをご覧ください。昨年のGoogle IOからのものであり、リストビューに関する最高のウォークスルーです。
http://www.youtube.com/watch?v=wDBM6wVEO70
レイアウト (res/layout/ フォルダーの xml ファイル) を LinearLayout やその他のビューなどの Java オブジェクトにインフレートします。
ビデオを見て、変換ビューの使用方法について最新情報を入手してください。基本的には、新しいオブジェクトを作成してリストのスクロールを遅くするのを避けるために、再利用されるのを待っているリサイクルされたビューです。
アダプタからリスト ビューを参照できます。
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になります。
お役に立てれば :)
レイアウト インフレータは、現在のビューに外部 XML をインフレート/追加します。
getView() は、スクロール時も含めて何度も呼び出されます。したがって、すでにビューが膨張している場合、膨張はコストのかかるプロセスであるため、再度実行したくありません..そのため、null かどうかを確認してから膨張させます。
親ビューは、リストの単一のセルです..
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;
}
}
getView()
メソッド create new View
or ViewGroup
for each row of Listview
or Spinner . これを定義するView
か、フォルダー内ViewGroup
のLayout XML
ファイルで定義し、クラス Objectres/layout
への参照を与えることができます。Adapter
アダプターに渡された配列に4つのアイテムがある場合。getView()
メソッドは、Adaper の 4 つの行に対して 4 つのビューを作成します。
LayoutInflater クラスには、XML リソース レイアウトから View オブジェクトを作成するメソッド inflate() があります。
また、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);