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.

InformationsquelleAutor user3164083 | 2014-01-20