2014-03-12 41 views
0

我正在使用LazyList異步加載列表視圖中的圖像。 github的例子工作得很好,但是當我在應用程序中使用它時,只要我滾動,它就會大量滯後。Android LazyList-ListView滯後於滾動

這裏是我的代碼:

MainActivity:

public class MainActivity extends Activity { 

    public static List<EpisodeEntry> episodes; 
    public static ImageLoader imageLoader; 
    public ListView list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     imageLoader = new ImageLoader(this); 
     list = (ListView) findViewById(R.id.mainList); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     new GetXmlTask().execute(); 
    } 


    private class GetXmlTask extends AsyncTask<Boolean, Void, List<String>> { 

     private List<EpisodeEntry> episodes = new ArrayList<EpisodeEntry>(); 

     @Override 
     protected List<String> doInBackground(Boolean... booleans) { 
      //xml gets parsed into ArrayList episodes 
     } 


     @Override 
     protected void onPostExecute(List<String> xml) { 
      if (xml != null) { 
       ItemAdapter adapter = new ItemAdapter(getApplicationContext(), episodes); 
       list.setAdapter(adapter); 
      } 
     } 

    } 

ItemAdapter: 公共類ItemAdapter擴展ArrayAdapter {

private final Context context; 
    private final List<EpisodeEntry> values; 

    public ItemAdapter(Context context, List<EpisodeEntry> values) { 
     super(context, R.layout.rowlayout, values); 
     this.context = context; 
     this.values = values; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.rowlayout, parent, false); 
     ImageView pic = (ImageView) rowView.findViewById(R.id.list_image); 
     MainActivity.imageLoader.DisplayImage("...", seriesPic); 

     return rowView; 
    } 
} 

的FileCache,ImageLoader的和的MemoryCache類是完全一樣here

圖像(50)只有64x64,大小爲幾KB。爲什麼在我的應用程序中滾動而不是在示例應用程序中滯後?

回答

1

您的性能問題的原因可能是您的適配器。

您應該使用convertView(如果可用),否則您的適配器將爲列表中的每個項目添加一個新的視圖。

View rowView = convertView; 
if (rowView == null) { 
    rowView = inflater.inflate(R.layout.rowlayout, parent, false); 
} 

當您向下滾動列表時,留下可見的視圖可作爲convertView重用。使用該代碼,您的列表將在列表的可見部分中顯示儘可能多的視圖並在滾動時重用這些視圖。

還閱讀View Holder進一步提高列表性能。

+0

謝謝,使用convertView解決了我的問題! 但是,爲什麼創建一個新的視圖這麼慢? –

+0

對象分配總是過於防範,視圖也會經過不同的過程,如佈局和測量,並且根據佈局,這可以快速加起來 – ozzy91