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