Android: getView() appelé deux fois dans la coutume adaptateur
Je suis réglage personnalisé SimpleCursorAdapter à une ListView. Pour une raison quelconque FriendAdapter de getView() est appelée deux fois pour chaque élément dans la DB. Après quelques recherches (je n'ai pas wrap_content dans mon contact_list.xml), je ne parviens toujours pas à comprendre pourquoi.
Quelles peuvent être les raisons? Quelqu'un peut m'aider?
Grâce
ContactSelection.java
public class ContactSelection extends ListActivity {
private WhipemDBAdapter mDbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbHelper = new WhipemDBAdapter(this);
mDbHelper.open();
setContentView(R.layout.contact_list);
Cursor c = mDbHelper.fetchAllFriends();
startManagingCursor(c);
String[] from = new String[] {};
int[] to = new int[] {};
setListAdapter(new FriendAdapter(this, R.layout.contact_row, c, from, to));
getListView().setItemsCanFocus(false);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
@Override
protected void onResume() {
super.onResume();
mDbHelper.open();
}
@Override
protected void onPause() {
super.onPause();
mDbHelper.close();
}
}
FriendAdapter.java
public class FriendAdapter extends SimpleCursorAdapter implements OnClickListener {
private Context mContext;
private int mLayout;
private Cursor mCursor;
private int mNameIndex;
private int mIdIndex;
private LayoutInflater mLayoutInflater;
private final ImageDownloader imageDownloader = new ImageDownloader();
private final class ViewHolder {
public TextView name;
public ImageView image;
public CheckBox checkBox;
}
public FriendAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.mContext = context;
this.mLayout = layout;
this.mCursor = c;
this.mNameIndex = mCursor.getColumnIndex(WhipemDBAdapter.KEY_NAME);
this.mIdIndex = mCursor.getColumnIndex(WhipemDBAdapter.KEY_FB_ID);
this.mLayoutInflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
if (mCursor.moveToPosition(position)) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = mLayoutInflater.inflate(mLayout, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView) convertView.findViewById(R.id.contact_name);
viewHolder.image = (ImageView) convertView.findViewById(R.id.contact_pic);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
viewHolder.checkBox.setOnClickListener(this);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
String name = mCursor.getString(mNameIndex);
String fb_id = mCursor.getString(mIdIndex);
boolean isChecked = ((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id);
viewHolder.name.setText(name);
imageDownloader.download("http://graph.facebook.com/"+fb_id+"/picture", viewHolder.image);
viewHolder.checkBox.setTag(fb_id);
viewHolder.checkBox.setChecked(isChecked);
}
return convertView;
}
@Override
public void onClick(View v) {
CheckBox cBox = (CheckBox) v;
String fb_id = (String) cBox.getTag();
if (cBox.isChecked()) {
if (!((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id))
((GlobalVars) mContext.getApplicationContext()).addSelectedFriend(fb_id);
} else {
if (((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id))
((GlobalVars) mContext.getApplicationContext()).removeSelectedFriend(fb_id);
}
}
}
contact_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/contact_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/contact_name"
android:textSize="10sp"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
contact_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="No items"/>
</LinearLayout>
OriginalL'auteur jul | 2011-03-08
Vous devez vous connecter pour publier un commentaire.
Ceci est normal et peut se produire lorsque vous avez une listview avec
height=wrap_content
(parmi d'autres):De regarder le dernier post: http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594
Le lien dit: c'est normal, ne vous inquiétez pas à ce sujet.
Ouais, il m'est arrivé à moi aussi. Semble être le comportement normal. Cependant, vous pouvez l'éviter, parfois, si vous n'exécutez votre code dans
getView()
en fonction de la position de l'ID. C'est une sorte de hacky."ne vous inquiétez pas à ce sujet.", bien que cela m'a fait beaucoup de comportement indésirable qui a été difficile à déboguer. Heureux que j'ai trouvé ce post!
Je pense que nous devrions nous inquiéter si la carte est gourmande en ressources. Dans mon cas, c'est un problème, trop.
OriginalL'auteur Peter Knego
J'ai utilisé ce. Le
getView
s'exécute deux fois, mais si vous vérifiez siconvertView
estnull
, le code sera exécuté une fois.OriginalL'auteur user2064635
Pour moi, il semble que la vue est créé deux fois dans la même méthode. Dans "si(convertView==null)" et l'autre "autre chose". Si je n'ai rien fait à la fois de la si les déclarations alors qu'il n'est créé qu'une seule fois. Il semble que la méthode elle-même n'est appelée qu'une fois.
OriginalL'auteur user5130224
Afin de getView obtenir de l'appel qu'une seule fois pour chaque ligne, vous avez besoin d'appeler super.getView puis modifiez le retour de vue. C'est quelque chose comme cela
OriginalL'auteur gmauri21