2012-07-23 24 views
3

Im建立一個列表視圖與部分。我正在使用this回覆的帖子,之前問過一個問題,但我再次卡住了。我認爲這是一個非常奇怪的錯誤。列表視圖和ViewHolder(s)和部分滾動時失敗

當我開始我的活動時,我可以看到屏幕上的列表,就像我想要的一樣。但是當我嘗試開始滾動活動崩潰時。我以爲我以同樣的方式實施了一切,但顯然我不是。 我的適配器:

public class DelftAdapter extends BaseAdapter { 


    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_SECTION = 1; 
    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; 
    } 

    @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 
    } 


    public View getView(int position, View convertView, ViewGroup parent) { 
     int type = getItemViewType(position); 
     View vi=convertView; 
      final ListItem li = listItems.get(position); 
      ItemViewHolder itemHolder; 
      SectionViewHolder sectionHolder; 

      switch (type) { 
      case TYPE_SECTION: // is sectionheader 
       if (vi == null) { //convertview==null 
       sectionHolder = new SectionViewHolder(); 
       vi = inflater.inflate(R.layout.sectionedlistitem, null); 
       vi.setOnClickListener(null); 
       vi.setOnLongClickListener(null); 
       vi.setLongClickable(false); 
       sectionHolder.title = (TextView) vi.findViewById(R.id.list_header_title); 
       }else{//convertview is not null 
        sectionHolder = (SectionViewHolder)vi.getTag(); 
       } 
        SectionItem si = (SectionItem)li; 
        sectionHolder.title.setText(si.getTitle()); 
       break; 
      case TYPE_ITEM:// no sectionheader 
       if (vi == null) { //convertview==null 
        itemHolder = new ItemViewHolder(); 
        vi = inflater.inflate(R.layout.singlelistitem, null); 
        itemHolder.name=(TextView)vi.findViewById(R.id.tvname); 
        itemHolder.tip=(TextView)vi.findViewById(R.id.tvtip); 
        itemHolder.image=(ImageView)vi.findViewById(R.id.image); 
       }else{ // convertview != null 
        itemHolder = (ItemViewHolder)vi.getTag(); 
       } 
       ListData ld = (ListData)li; 
       itemHolder.name.setText(ld.name); 
       itemHolder.tip.setText(ld.tip); 
         if (ld.photoUrl != null){ 
          imageLoader.DisplayImage(ld.photoUrl, itemHolder.image); 
         }else{ 
          itemHolder.image.setImageURI(Uri.fromFile(new File("//assets/nopic.png"))); 
         } 
         // alternating colors 
        int colorPos = position % bgColors.length; 
        vi.setBackgroundResource(bgColors[colorPos]); 
        break; 
       } 


     return vi; 

} 
    public static class SectionViewHolder { 
     public TextView title; 
    } 

    public static class ItemViewHolder { 
     public TextView name; 
     public TextView tip; 
     public ImageView image; 
    } 

} 

我建造兩艘ViewHolders了兩種不同的觀點。發生的錯誤是itemHolder.name.setText(ld.name);行上的NullPointerException。 我沒有得到的東西是,代碼適用於前幾個entrys,但失敗時,我開始滾動。在我使用的數據中,名稱和提示永遠不會爲空,只有photoUrl可能會被代碼覆蓋。

任何人都知道爲什麼這段代碼失敗?

回答

4

在你創建一個新的視圖並膨脹一個新視圖的代碼路徑中,你永遠不會實際存儲viewHolder在Views標記中,所以當你滾動並獲得一個存在視圖時,view.gettag()返回null,稍後當您嘗試使用ViewHolder時,您將得到空指針異常。您需要將調用添加到setTag()。

+0

很好,我加了vi.setTag(sectionHolder);和vi.setTag(itemHolder);現在它工作。謝謝。 – Jasper 2012-07-24 07:02:22