2011-08-12 11 views
3

私はチュートリアルを経て、検索が、それでも私は私のアンドロイドアプリケーションでカスタムリストビューを作成するためにBaseAdapterを拡張する場合、Androidのカスタムリストビュー

getView(int position, View convertView, ViewGroup arg2) 

方法がどのように動作するかを理解することはできません。したがって私は正確に私が望むカスタムリストビューを編集できません。

このメソッドが呼び出されるタイミングとパラメータの意味を知る必要があります。

誰かが次の方法を説明できる場合は、その偉大な。あなたのコードでsetAdapterを呼び出すときおかげ

@Override 
public View getView(int position, View convertView, ViewGroup arg2) 
{ 

    ViewHolder holder; 
    LayoutInflater inflater = context.getLayoutInflater(); 

    if (convertView == null) 
    { 
     convertView = inflater.inflate(R.layout.listitem_row, null);      
     holder = new ViewHolder(); 
     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); 
     holder.txtViewDescription = (TextView) convertView.findViewById(R.id.textView2); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag();           
    } 

    holder.txtViewTitle.setText(title[position]); 
    holder.txtViewDescription.setText(description[position]); 



    return convertView; 
} 

答えて

3

getView():仕様に記載されているとおり、getViewメソッドは指定された位置にデータを表示します。ですから、あなたがsetAdapterをスクロールしたときに、listViewのgetViewメソッドが呼び出されます。

あなたはここにコピーされた方法は、あなたのリストビューのパフォーマンスを最適化するために、EfficientAdapterの一部であり、最適化と一緒に、あなたはViewHolderパターンを使用しました。仕様からコピー

:ビュー私たちが望む項目のアダプタのデータセット内の項目の位置:より少し説明

位置付き。

convertView:可能であれば、再利用するための古いビュー。注:使用する前に、この ビューがnullではなく、適切なタイプであることを確認する必要があります。このビューを変換して正しいデータを表示できない場合、このメソッドは新しいビューを作成できます。異種リストはビューのタイプ数を指定することができるので、このビューは常に正しいタイプです(getViewTypeCount()およびgetItemViewType(int)を参照)。

したがって、上記の方法では、次のことを行うときにconvertViewを再利用しています。

 if (convertView == null){ 
      .... 
      convertView.setTag(holder); 
    } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

そして、あなたは、ルックアップ(findViewById)を避けている次のことを行うことで、どのような良いことを約ViewHolderパターン

 holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); 

のthats:このビューは、最終的になることを親

編集

質問:getViewが何回呼び出され、何個のconvertViewが作成されるのですか? 回答:Efficeint Adapter from ApiDemosの例を考えてみましょう。あなたの画面が10の行を表示している場合、

convertView Count:10 + 1 = 11(10行目は画面に表示され、1つは余分なスクロール効果を表示します)。つまり、if(convertView == null){...}ブロックの文は11回だけ呼び出されます。

getView Count:最初のカウントは10ですが、スクロールカウントを開始すると増加し続けます。データを更新するたびにgetViewが呼び出されます。

注:これは、上記のgetViewメソッドでのみ該当します。

+0

にロードする間に何度も実行されますが、このメソッドを使用してリストビューに項目をロードすると、getView()メソッドは、表示する。私は理解できません...... – JibW

+0

同時に、convertView = inflater.inflate(R.layout.listitem_row、null)を初めて作成した後、アイテムをロードするときに複数回実行されます。あなたはなぜ説明してくださいできますか? – JibW

+0

@ JibW確かに、画面上で視覚的にどのくらいの行が表示されているかによって異なります。 3行だけが表示されているとします。つまり、ListViewは3つのconvertViewを表示する必要があり、スクロールすると3つが再利用されます。一度にあなたはそれをあなたの画面に表示していないからです。なぜgetViewは3回呼び出されるのでしょうか? HierarchyViewerを使用すると、ConvertViewの数についての詳細を理解するのに役立ちます。あなたの質問に答えることを願っています...私にpingをしないと...私はあなたを助けてうれしいです。 – Gopal

4

getView()が呼び出されます。その後、リストにフォーカスを移動したり、項目を選択したり、notifyDataSetChanged()に電話をした場合、getView()に電話がかかります。

Position - 私たちが望むアイテムのアダプタのデータセット内のアイテムの位置。

convertView - 可能であれば、再利用するための古いビュー。注意:使用する前に、このビューがnullではなく、適切なタイプであることを確認する必要があります。このビューを変換して正しいデータを表示できない場合、このメソッドは新しいビューを作成できます。異種リストはビューの種類の数を指定できるので、このビューは常に正しいタイプです。

ViewGroup - このビューは最終的に添付されます。ここ

+0

こんにちはvineetska答えをありがとう。私のコードでは、このリストをロードするときに、getView()メソッドはリストビューのレコード数の3倍を呼び出します。私はログを作成してチェックしました。なぜこれがそうであるのか理解できません – JibW

+0

"LayoutInflater inflater =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);" "layoutInflater inflater = context.getLayoutInflater(); " –

+0

の代わりに、getView()のブロックがブロックされていても、それは同じ方法です。このメソッドと混乱しているビット。実際に実行を把握できません。このメソッドを実行する回数はレコードの3倍です(2回のリストビューレコードがリストに表示されると、このメソッドは6回実行されます) – JibW

2

getView()パラメータの説明である:

int position - リスト内のビューの位置。

View convertView - IMHO、これは理解のための最も難しいパラメータです。リストの仕事の始めにconvertView = null。しかし、あなたがそれを下にスクロールし始めるとき、リストの項目(それはViewのインスタンスです)が隠されると、それはconvertViewのようにメモリに格納されます。このトリックでは、のリストをスクロールするときには新しいアイテムを作成しませんが、convertViewをmemmoryに保存すると、は新しいアイテムを作成しません。だからconvertViewになるリストの最初の項目は0の位置にある項目です。 ListViewをスクロールすると(0桁から大きい桁まで)スクロールすると、ListViewをスクロールすると、上部と下部にconvertViewが位置することに注意してください。

ViewGroup arg2 - これはあなたのListViewです(このクラスはViewGroupから派生しています)。

ViewHolderは、リストの項目と快適な通信を行うパターンです。このオブジェクトをアイテムのタグとして作成し、アイテムのフィールド(View.setTag(holder))を参照しているため、リストのアイテムとの間接的な対話に使用できます。

getView()メソッドは、Androidが別のリストのアイテムを描画する必要があるたびに呼び出されます。

質問がありますか?

+0

ありがとうteoREtik .. 。このメソッドを使ってリストビューに項目をロードすると、getView()メソッドは表示する要素の数の3倍を実行します。(例えば、2つの要素をリストビューにロードする必要がある場合、getView()メソッドは6回実行されます)、なぜ理解できないのですか........ convertView = inflater.inflate(R.layout.listitem_row、 nullを参照)、convertview == nullをチェックすることで、要素をリストビュー – JibW

関連する問題