2013-05-13 53 views
1

網頁上可能有數千篇關於ListView和ListAdapter回收過程的文章,但目前爲止我無法解決我的問題。Android ListView「回收」不存儲最初不可見的行

我使用從遠程服務器獲取的數據自定義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 – 2013-05-13 05:36:12

回答

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行。 – 2013-05-13 00:58:32

+0

@EnginYapici:「我無法做到這一點,因爲我的行中有太多項目(包括圖像),並且它極大地減慢了滾動速度」 - 然後,您在主應用程序線程上做了錯誤的操作,例如從磁盤/網絡。 「我正在尋找一種方法來禁用回收並實際上保持行,因爲在給定的時間內,我永遠不會有超過15-16行」 - 重寫'getViewTypeCount()'返回'getCount()'並返回'getItemViewType()'返回'position',所以Android認爲每一行都是唯一的。還沒有嘗試過,但它應該工作。 – CommonsWare 2013-05-13 10:59:54

+0

@EnginYapici:並且請注意,我描述的破解仍然比僅僅解決性能問題更糟糕的想法。 – CommonsWare 2013-05-13 11:02:02