2013-05-13 7 views
1

Возможно, есть тысячи сообщений по всему миру о процессе перебора ListView и ListAdapter, но до сих пор я не мог решить свою проблему.Android ListView «recycle» не хранит строки, которые не видны изначально

У меня есть собственные строки ListView и заполняются элементы внутри строк (TextViews, ImageViews и т. Д.) С данными, которые я получаю с удаленного сервера. На экране может отображаться максимум 5 строк за раз, и мне нужно прокручивать, если у меня больше строк. Проблема в; адаптер сохраняет и перерабатывает только первые 5 строк информации, и даже если я прокручиваю, чтобы увидеть 6-е, 7-е, 8-е и т. д. строки, я снова и снова вижу те же 5 строк в случайных позициях.

Вот код:

public class ListAdapter extends BaseAdapter { 

    private ArrayList<String> id, name, address; 
    private Context context; 

    public ListAdapter(Context c, ArrayList<String> id, 
      ArrayList<String> name, ArrayList<String> address,) { 
     this.id = id; 
     this.name = name; 
     this.address = address; 
     this.context = c; 
    } 

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

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

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

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

     if (convertView == null) { 
      rowsLayout = (View)LayoutInflater.from(context) 
          .inflate(R.layout.list_item, null); 
      //Assign values to TextViews in here 
     } else { 
      rowsLayout = convertView; 
     } 
      return rowsLayout; 
    } 
} 

Я попытался с помощью метода в this website, но это не помогло.

Если кто-нибудь может предложить мне решение (с кодом пожалуйста) или направить меня на другой пост, я буду благодарен.

+0

см. Http://stackoverflow.com/questions/16515077/widget-in-listview-disappears-when-listview-scrolls-down/16515327#16515327 –

ответ

0

Изменить код из этого:

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

    if (convertView == null) { 
     rowsLayout = (View)LayoutInflater.from(context) 
         .inflate(R.layout.servisler_list_item, null); 
     //Assign values to TextViews in here 
    } else { 
     rowsLayout = convertView; 
    } 
     return servisRowsLayout; 
} 

к этому:

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

    if (convertView == null) { 
     rowsLayout = (View)LayoutInflater.from(context) 
         .inflate(R.layout.servisler_list_item, null); 
    } else { 
     rowsLayout = convertView; 
    } 

     //Assign values to TextViews in here 

     return servisRowsLayout; 
} 

Вам нужно "Присвоение значений TextViews" на каждыйgetView() вызов, а не только некоторые из них.

+0

Я должен был упомянуть об этом в своем первоначальном посте; Я не могу этого сделать, потому что у меня слишком много элементов (включая изображения) в строках, и это сильно замедляет свиток. Я ищу способ отключить рециркуляцию и постоянно держать строки на самом деле, потому что у меня никогда не будет более 15-16 строк в данный момент времени. –

+0

@EnginYapici: «Я не могу этого сделать, потому что у меня слишком много элементов (включая изображения) в строках, и это сильно замедляет прокрутку» - тогда вы делаете что-то не так в главном потоке приложения, например, загружаете изображения с диска/сеть. «Я ищу способ отключить повторное использование и постоянно держать строки на самом деле, потому что у меня никогда не будет более 15-16 строк в данный момент времени» - переопределить 'getViewTypeCount()' для возврата 'getCount()' и return 'getItemViewType()' для возврата 'position', поэтому Android считает, что каждая строка уникальна. Не пробовал это, но он должен работать. – CommonsWare

+0

@EnginYapici: И обратите внимание, что хак, который я описал, по-прежнему намного хуже, чем просто устранение проблемы с производительностью в первую очередь. – CommonsWare

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