2012-07-23 60 views
2

我使用列表視圖帶或不帶convertview == NULL

if (convertview==null){ 
(my code) 
} 

與否左右爲難。沒有這段代碼,我的列表視圖不是很快,它有時鎖定幾個毫秒,你可以很容易地注意到這個使用。它的工作原理並不起作用。

但是,當這段代碼,我的listitems將開始重新計算一段時間後(10左右),我有幾個返回listitems在我的列表中(與我使用的標題)。我使用本教程來獲取我的列表視圖link。名單的長度是好的。

Ofcourse當然,我的列表是完全無用的重複項目的視圖(很好地分段的方式),但我也不希望它慢。 有誰知道該怎麼辦? 下面是我的適配器:

公共類DelftAdapter延伸BaseAdapter {

private Activity activity; 
private List<ListItem> listItems; 
private static LayoutInflater inflater=null; 
public ImageLoader imageLoader; 
private final int[] bgColors = new int[] { R.color.list_odd, R.color.list_even }; 


public DelftAdapter(Activity a, ArrayList<ListItem> li) { 
    activity = a; 
    listItems = li; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 

} 

public int getCount() { 
    return listItems.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

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




public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 


     final ListItem li = listItems.get(position); 
     if (li != null) { 
      if(li.isSection()){ // is sectionheader 
       SectionItem si = (SectionItem)li; 
       vi = inflater.inflate(R.layout.sectionedlistitem, null); 
       vi.setOnClickListener(null); 
       vi.setOnLongClickListener(null); 
       vi.setLongClickable(false); 
       final TextView sectionView = (TextView) vi.findViewById(R.id.list_header_title); 
       sectionView.setText(si.getTitle()); 
      }else{ // no sectionheader 
       ListData ld = (ListData)li; 
      vi = inflater.inflate(R.layout.singlelistitem, null); 
     TextView tvNames=(TextView)vi.findViewById(R.id.tvname); 
     TextView tvTip=(TextView)vi.findViewById(R.id.tvtip); 
     ImageView image=(ImageView)vi.findViewById(R.id.image); 
     tvNames.setText(ld.name); 
     tvTip.setText(ld.tip); 
      if (listItems.get(position) != null){ 
       imageLoader.DisplayImage(ld.photoUrl, image); 
       } 
       else{ 
       image.setImageURI(Uri.fromFile(new File("//assets/eten.png"))); 
      } 
     // alternating colors 
     int colorPos = position % bgColors.length; 
      vi.setBackgroundResource(bgColors[colorPos]); 
      } 
    } 
     return vi; 

} 
} 

回答

5

考慮使用getItemViewType()getViewTypeCount()與回收convertView。這些用於具有各種佈局的列表項。你肯定應該回收convertView

http://android.amberfog.com/?p=296

見你的情況:

private static final int TYPE_ITEM = 0; 
    private static final int TYPE_SECTION = 1; 

    @Override 
    public int getItemViewType(int position) { 
     return listItems.get(position).isSection() ? TYPE_SECTION : TYPE_ITEM 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; // sectionheader and regular item 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     int type = getItemViewType(position); 
     if (convertView == null) { 
      switch (type) { 
       case TYPE_ITEM: 
        convertView = mInflater.inflate(R.layout.singlelistitem, null); 
        ... 
        break; 
       case TYPE_SECTION: 
        convertView = mInflater.inflate(R.layout.sectionedlistitem, null); 
        ... 
        break; 
      } 
     } else { 
      ... 
     } 
     return convertView; 
    } 

還可以使用ViewHolder模式來獲得更好的性能。

+0

我獨家使用這個和ViewHolder模式,它可能是鍋爐板代碼,但它確實有助於性能。 – ScouseChris 2012-07-23 15:25:54

+0

我讓它工作!但是現在我按照建議實現ViewHolder模式,但非常感謝。 – Jasper 2012-07-23 21:33:44

+0

嗨,我也有與部分ListViews的麻煩。 這是我的兩個佈局: – ryvianstyron 2012-11-09 21:17:42