2014-01-11 30 views
0

我定義了一個適配器,它延伸BaseAdapter當我用ListView來顯示東西。我重寫View getView (int position, View convertView, ViewGroup parent)方法重用視圖組件,在方法中,我也寫了if(convertView == null) {System.out.println("test");}塊。 ListView有50行數據,屏幕只能顯示20行左右的數據。當我運行該應用程序時,儘管我滑動屏幕以確保所有數據都已加載,但LogCat打印的行少於50行「測試」。但爲什麼?我認爲它應該打印50行數據。下面是關鍵代碼:我不明白爲什麼getView()方法無法正確運行時,我重用視圖組件

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

    if(convertView == null) { 
     convertView = inflater.inflate(resource, null); 
     System.out.println(++count + "convertView == null:" + convertView); 
    } 
} 

有人請幫助我,我是一個新手....感謝

回答

0

因爲convertViewnull僅如果沒有可以回收先前所返回視圖(即它不再在屏幕上)。

您從適配器的getView()返回的視圖可以在稍後調用getView()時回收。該框架通過convertView參數傳遞了可回收的視圖。

所以你的convertView == null分支只能運行足夠多的次數來填充列表視圖屏幕一次,之後,當滾動時,這些舊的視圖被回收。

1

Android不誇大爲您的適配器每一個項目視圖。它重複使用先前用於其他項目的充實視圖。

在一個適配器綁定視圖的模式是這樣的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if(convertView == null) { 
     view = inflater.inflate(resource, null); 
    } else { 
     view = convertView; 
    } 
    // bind data to view here 
    return view; 
} 

事實上,你通常會使用一個ViewHolder類。但在閱讀有關信息之前,請先修復基本適配器。

0

您缺少return view

ListView回收視圖。 How ListView's recycling mechanism works

使用ViewHolder模式

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if(convertView == null) { 
    convertView = inflater.inflate(resource, null); 
    holder = new ViewHolder(); 
    holder.tv = (TextView)convertView.findViewById(R.id.textView1); 
    //initialize views 
    convertView.setTag(holder); 
    } else { 
    holder =(ViewHolder) convertView.getTag(); 
    } 
    // update your view here 
    holder.tv.setText("hi"); 
    return convertView; 
} 

static class ViewHolder { 
    // YourViews Declaration 
    TextView tv; // an example 
} 
相關問題