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
、最初と最後のエントリの唯一のハッシュコードです毎回交換される。これは何が原因でしょうか?
これは 'ListView'のためのものですか?その場合、 'ListView'は既存のビューをリサイクルします。つまり、' convertView'が対象です。 'convertView'が' null'でなければ、それを使って新しい 'View'を返す必要があります。 – Squonk
はい、これはListviewです。 OK ...これはやっかいです。つまり、getView()が呼び出されるたびにsetTag()を呼び出す必要があります。 convertViewがnullの場合にのみ、私はそれをやっていました!私は間違いだと思う。 – nayan