2014-09-11 7 views
3

У меня возникла некоторая проблема для рендеринга ListView из динамического макета. Не знаю, почему getView вызывается только с позицией 0 и несколько раз!Адаптер getView вызывается несколько раз с положением 0

Я искал через Интернет и stackoverflow, но не могу найти подходящий ответ.

Я на самом деле пытается сделать демо это: http://www.framentos.com/en/android-tutorial/2012/07/16/listview-in-android-using-custom-listadapter-and-viewcache/

Примечательно, что мой основной файл макета окружен скроллинга.

основной файл макета деятельности:

<ListView 
     android:id="@+id/city_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/questionsList" 
     android:paddingTop="20sp" > 
    </ListView> 

Мой файл макета для просмотра списка:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="80dip" > 

     <ImageView 
      android:id="@+id/ImageCity" 
      android:layout_width="90sp" 
      android:layout_height="90sp" /> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_toRightOf="@id/ImageCity" 
      android:orientation="vertical" 
      android:paddingLeft="10sp"> 

      <TextView 
       android:id="@+id/cityName" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textSize="25sp" /> 

      <TextView 
       android:id="@+id/cityLinkWiki" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:autoLink="web" 
       android:textSize="15sp" /> 
     </LinearLayout> 

    </RelativeLayout> 

класс Adapter:

import com.incidentreport.app.classes.objects.City; 

    public class CityListAdapter extends ArrayAdapter{ 

     private int resource; 
     private LayoutInflater inflater; 
     private Context context; 

     public CityListAdapter (Context ctx, int resourceId, List objects) { 

      super(ctx, resourceId, objects); 
      resource = resourceId; 
      inflater = LayoutInflater.from(ctx); 
      context=ctx; 
     } 

     @Override 
     public View getView (int position, View convertView, ViewGroup parent) { 

      Log.v("adapter", "pos: " + position + "#" + resource); 
      /* create a new view of my layout and inflate it in the row */ 

      convertView = (RelativeLayout) inflater.inflate(resource, null); 

      /* Extract the city's object to show */ 
      City city = (City)getItem(position); 

      /* Take the TextView from layout and set the city's name */ 
      TextView txtName = (TextView) convertView.findViewById(R.id.cityName); 

      txtName.setText(city.getName()); 

      /* Take the TextView from layout and set the city's wiki link */ 
      TextView txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki); 
      txtWiki.setText(city.getUrlWiki()); 

      /* Take the ImageView from layout and set the city's image */ 
      ImageView imageCity = (ImageView) convertView.findViewById(R.id.ImageCity); 

      return convertView; 
     } 
    } 

основной код деятельности snipps:

List listCity= new ArrayList(); 

    listCity.add(new City("London","http://en.wikipedia.org/wiki/London","london")); 
    listCity.add(new City("Rome","http://en.wikipedia.org/wiki/Rome","rome")); 
    listCity.add(new City("Paris","http://en.wikipedia.org/wiki/Paris","paris")); 

    ListView listViewCity = (ListView) findViewById(R.id.city_list); 

    listViewCity.setAdapter(new CityListAdapter(this, R.layout.layout_city, listCity )); 
+0

Используйте шаблон ViewHolder. используйте 'inflater.inflate (ресурс, родительский, false);'. – Raghunandan

+0

«Примечательно, что мой основной файл макета окружен полосой прокрутки». ? Что вы имеете в виду? Затем покажите это. – greenapps

+0

do read http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ – Raghunandan

ответ

2

Хорошо, я выяснил проблему, расширив ListView как можно больше. Смысл сказать, давая динамическую полную высоту, чтобы весь предмет стал видимым.

Я последовал за решение ниже:

Calculate the size of a list view or how to tell it to fully expand

+0

У меня была такая же проблема. В моем случае я помещал ListView и некоторые дополнительные компоненты внутри ScrollView и устанавливал содержимое обертки ScrollView –

1

Попробуйте этот путь, надейтесь, что это поможет вам решить вашу проблему.

public class CityListAdapter extends BaseAdapter{ 
    private Context context; 
    private List objects; 

    public CityListAdapter (Context context, int resourceId, List objects) { 
     this.context=context; 
     this.objects=objects; 

    } 

    @Override 
    public int getCount() { 
     return objects.size(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public Object getItem(int position) { 
     return objects.get(position); 
    } 

    @Override 
    public View getView (int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if(convertView==null){ 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(context).inflate(R.layout.layout_city,null); 
      holder.txtName = (TextView) convertView.findViewById(R.id.cityName); 
      holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki); 
      holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity); 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.txtName.setText(((City)getItem(position)).getName()); 
     holder.txtWiki.setText(((City)getItem(position)).getUrlWiki()); 

     return convertView; 
    } 

    class ViewHolder{ 
     TextView txtName; 
     TextView txtWiki; 
     ImageView imageCity; 
    } 
} 
1

Используйте ViewHolder шаблон для повышения производительности.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

static class ViewHolder 
{ 
    TextView txtName,txtWiki; 
    ImageView imageCity; 
} 

Изменение GetView к

@Override 
    public View getView (int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 
     if(convertView == null) 
     { 

     convertView = (RelativeLayout) inflater.inflate(resource, parent, false); 
     holder = new ViewHolder(); 
     holder.txtName = (TextView) convertView.findViewById(R.id.cityName); 
     holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki); 
     holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity); 
     convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     City city = (City)getItem(position); 

     holder.txtName.setText(city.getName()); 
     holder.txtWiki.setText(city.getUrlWiki()); 

     return convertView; 
    } 

ListView recyclues вида. Вы также можете прочитать

How ListView's recycling mechanism works

+0

Привет, друг Я пробовал с этим .. но все еще сталкивался с той же проблемой. Я поставил Log.v внутри getView. Кажется, getView вызывается с 0 09-11 02: 40: 13.006 2508-2508/V/test: # 0 09-11 02: 40: 13.063 2508-2508/V/test: # 0 09- 11 02: 40: 13.066 2508-2508/V/test: # 0 09-11 02: 40: 13.068 2508-2508/V/test: # 0 09-11 02: 40: 13.070 2508-2508/V/test: # 0 – masum7

+0

@ masum7 он должен работать. Никогда не помещайте listview внутри scrollview. – Raghunandan

+0

Какой у меня альтернативный вариант? Вместо ListView? У меня должен быть scrollview – masum7

0

Try, чтобы получить макет Inflater, как LayoutInflater Inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); Это может работать

1

Я столкнулся с этой же проблемой. Мой список в основном работает, но есть определенная последовательность действий, которые заставят определенные элементы исчезнуть. Нажатие на них впоследствии вызывает исключение NullPointerException.

Вот шаги, чтобы воспроизвести ошибку:

  1. Перетащите элемент в верхней части.
  2. Перетащите другой предмет вверх или вниз.
  3. Элемент наверху исчезнет.
  4. Перетащите другой предмет вверх или вниз.
  5. Верхний элемент снова появится.
  6. Поведения продолжается, если вы переходите к шагу 2

После отладки, я обнаружил, что метод моего StableArrayAdapter.getView() был вызывается дважды, только для пустого элемента в верхней части списка.

Чтобы исправить это, за ответ masum7 я установил layout_height для моего DynamicListView в "wrap_content".

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