BaseAdapter.getView() pour ListActivty à l'aide de ViewHolder - Android
C'était mon original de la méthode getView pour la liste de BaseAdapter:
//create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { //if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
ImageHelper ih = new ImageHelper();
imageView.setImageBitmap(ih.decodeSampledBitmapFromResource(mContext.getResources(), mList.get(position), 40, 40));
return imageView;
}
Il n'a pas fait usage de convertView et je n'ai eu aucun mInflater. J'ai lu que ce chemin n'est pas bon pour l'utilisation de la mémoire, et j'ai trouvé une meilleure façon qui utilise un ViewHolder. J'ai changé cette méthode à mettre en œuvre un viewHolder et l'utilisation de la convertView au lieu de faire une ImageView comme je l'ai d'abord fait:
static class ViewHolder{
TextView text;
ImageView icon;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
ImageView imageView = new ImageView(mContext);
ImageHelper ih = new ImageHelper();
if (convertView == null) {
convertView = mInflater.inflate(R.id.gridviewViewOutfits, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView;
holder.icon.setLayoutParams(new GridView.LayoutParams(150, 150));
holder.icon.setScaleType(ImageView.ScaleType.FIT_CENTER);
holder.icon.setPadding(8, 8, 8, 8);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageBitmap(ih.decodeSampledBitmapFromResource(mContext.getResources(), mList.get(position), 40, 40));
return convertView;
}
Cette ligne a causé une exception nullPointerException: convertView = mInflater.inflate(R.id.gridviewViewObjects, null);
C'est parce que je n'avais pas instancié mon mInflater. Puis je l'ai fait comme ceci: mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Parce que j'ai vu en ligne. Puis j'ai eu cette erreur:
01-20 20:37:52.080: E/AndroidRuntime(22543): FATAL EXCEPTION: main
01-20 20:37:52.080: E/AndroidRuntime(22543): android.content.res.Resources$NotFoundException: Resource ID #0x7f04002b type #0x12 is not valid
01-20 20:37:52.080: E/AndroidRuntime(22543): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2136)
01-20 20:37:52.080: E/AndroidRuntime(22543): at android.content.res.Resources.getLayout(Resources.java:865)
01-20 20:37:52.080: E/AndroidRuntime(22543): at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
01-20 20:37:52.080: E/AndroidRuntime(22543): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
01-20 20:37:52.080: E/AndroidRuntime(22543): at com.btf271.imagehelper.ChooseStickersImageAdapter.getView(ChooseObjectsImageAdapter.java:136)
Que dois-je faire pour instancier le mInflater, ou suis-je gonfler la mauvaise chose?
C'est mon XML pour la ListActivity:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ViewOutfitsActivity" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
<GridView
android:id="@+id/gridviewViewObjects"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</RelativeLayout>
Merci.
Vous devez vous connecter pour publier un commentaire.
Ici quand vous avez gonflé vue, à ce moment, vous devriez utiliser la mise en page
donc changer à partir de ce
à
changement mInflater.inflate(R. id.gridviewViewOutfits, null); à mInflater.inflate(R. layout.gridviewViewOutfits, null);
R.id.gridviewViewOutfits
se réfère à laGridView
vous voulez remplir, qui ne fait pas de sens.Vous devez créer une mise en page pour les éléments que vous voulez avoir dans votre
GridView
, commencer avec une Mise en page simple contenant unTextView
par exemple. Ensuite, vous gonfler cette mise en page avecet de le remplir avec vos données.
Vous avez besoin de créer un autre fichier de mise en page pour un élément de Liste et de le gonfler.