2014-01-20 1 views
2

Это был мой оригинальный метод GetView для ListView BaseAdapter:BaseAdapter.getView() для ListActivty с помощью ViewHolder - Android

// 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; 
     } 

Это не использовать convertView и у меня не было mInflater. Я читал, что этот способ не подходит для использования памяти, и я нашел лучший способ использования ViewHolder. Я изменил этот метод, чтобы реализовать viewHolder и использовать convertView вместо произведя ImageView, как я первоначально сделал:

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; 
       } 

Эта линия вызвала NullPointerException: convertView = mInflater.inflate(R.id.gridviewViewObjects, null);

Это потому, что я не экземпляр моего mInflater. Затем я сделал это вот так: mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Потому что я видел это онлайн. Тогда я получил эту ошибку:

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) 

Что я должен сделать, чтобы создать экземпляр mInflater, или я накачивание неправильной вещи?

Это мой XML для 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> 

Спасибо.

ответ

1

Вот когда вы раздули вид в то время вы должны использовать компоновки

так измениться от этого

convertView = mInflater.inflate(R.id.gridviewViewOutfits, null); 

в

convertView = mInflater.inflate(R.layout.gridviewViewOutfits, null); 
+0

Мой gridViewViewOutfits - это просто представление внутри моего макета ListActivity. Итак, нужно ли щелкнуть правой кнопкой мыши папку макета и щелкнуть новый файл XML, чтобы создать новый макет? Тогда раздуйте это? Спасибо. – user3164083

+0

Да, если вы хотите создать собственный список, тогда вы должны использовать его. И вы идете в правильном направлении. – Piyush

+0

Спасибо. Для моего пользовательского макета есть много корневых элементов. Я выбираю RelativeLayout или ListView или что-то еще? – user3164083

0

изменение mInflater.inflate (R.id.gridviewViewOutfits, null); to mInflater.inflate (R.layout.gridviewViewOutfits, null);

+0

Спасибо. В нем говорится: «gridviewViewOutfits не может быть разрешен или не является полем» – user3164083

+0

, тогда вам просто нужно его импортировать: import YOUR_APP_PACKAGE_NAME.R.layout.gridviewViewOutfits –

0

R.id.gridviewViewOutfits относится к GridView, который вы хотите заполнить, что не имеет смысла. Вам нужно создать макет для элементов, которые вы хотите разместить в своем GridView, начните с простого макета, содержащего TextView, например. Затем вы раздуваете этот макет с помощью

mInflater.inflate(R.layout.exampleItem, null); 

и заполните его своими данными.

+0

Спасибо. Это просто отобразит изображения в gridView. Вы имеете в виду, что я создаю целый новый XML-файл, такой как файл, который каждая активность создала автоматически? Я никогда этого не делал. Если бы я щелкнул правой кнопкой мыши папку «Макет» и щелкнул новый файл XML? – user3164083

+0

Точно, это то, что вам нужно. Если вы хотите отображать только изображение, макет должен содержать только ImageView. Возможно, вы захотите прочитать учебное пособие, подобное этому: http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown_custom Это о ListViews, но часть адаптера точно такая же для GridViews. – FWeigl

+0

Спасибо. Я закончил, и он работает. Однако все было напрасно, куча все еще так же велика.Я убежден, что он растет из этого спискаView и не уменьшается после выхода из ListView. О, ну, на мой оригинальный вопрос ответили хорошо :) – user3164083

0

Вам нужно создать еще один файл макета для элемента списка и раздуйте его.

+0

Спасибо :) Должен ли я дать ему корневой элемент RelativeLayout? Я создаю его сейчас и не знаю, какой вариант выбрать. Или мне нужно искать ListView? – user3164083

+0

Да, вы должны дать ему корневой элемент RelativeLayout или любой другой класс макета –

Смежные вопросы