2012-01-12 2 views
1

ArrayAdapterから継承したカスタムContactListAdapterを記述しました。リストに3つの要素しかないとしましょう。 getView()の各呼び出しで受け取ったViewオブジェクトの位置とハッシュコードを表示しています。ビューオブジェクトが正しく返されていないことがわかりました。私はここで何か間違っていますか?Android:getView()が正しいViewオブジェクトを返さない

private class ContactListAdapter extends ArrayAdapter<ContactItem> { 
... ... 
    @Override 
    public View getView(int aPosition, View aConvertView, ViewGroup aParent) { 
     Log.d(TAG, "Inside ContactListAdapter.getView()"); 
     if(aConvertView==null) { 
      Log.d(TAG, "ConvertView is null"); 
      // Inflate view... 
     } 
     Log.d(TAG, "Pos: " + aPosition + " View: " + aConvertView.hashCode()); 
     return aConvertView; 
    } 

は、ここで最初のビューを作成するためのログです:

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

そして、私は、リストの3番目の要素をクリックして、ログ(最初と最後の要素のハッシュコードを交換する方法に注目してください)。私のonClickメソッドは、単にそれぞれのリストのエントリに、いくつかのエンティティを可能にします:

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1157027832 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1156974184 

そして、私は第二の要素をクリックしてログ:これは繰り返し観察され

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

、最初と最後のエントリの唯一のハッシュコードです毎回交換される。これは何が原因でしょうか?

+0

これは 'ListView'のためのものですか?その場合、 'ListView'は既存のビューをリサイクルします。つまり、' convertView'が対象です。 'convertView'が' null'でなければ、それを使って新しい 'View'を返す必要があります。 – Squonk

+0

はい、これはListviewです。 OK ...これはやっかいです。つまり、getView()が呼び出されるたびにsetTag()を呼び出す必要があります。 convertViewがnullの場合にのみ、私はそれをやっていました!私は間違いだと思う。 – nayan

答えて

3

convertViewは、アダプタビューのビューを再利用するために使用されるので、リストを表示しているときに画面が5行ずつ表示される場合、5行でビューを作成するとconvertViewはnullのままですが、アダプタビューの新しいビューが作成されるので、位置1のリスト再利用ビューの6番目の要素が作成されます。

+0

その場合、ViewHolderイディオムがどのように機能しますか。たとえば、setTag()を使用して、ビュー内の各要素と別々のデータを格納する場合です。 – nayan

+0

ViewHolderでは、アダプタビューでビューのViewオブジェクトを取得し、各ビューに新しい値を設定するので、両方のローが異なるビューを使用しているように見えます。 – jeet

関連する問題