3

セクション付きのリストビューを作成しています。私はこの投稿の回答を使用していて、以前に質問をしていましたが、再び行き詰まりました。かなり奇妙なエラーだと思います。

アクティビティを開始すると、希望どおりにリストが画面に表示されます。しかし、スクロールを開始しようとすると、アクティビティがクラッシュします。私はすべてを同じ方法で実装したと思いましたが、どうやらそうではありません。私のアダプター:

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

2つの異なる種類のビュー用に2つのViewHolderを作成します。発生するエラーは、 itemHolder.name.setText(ld.name);回線上のNullPointerExceptionです。私が得られないのは、コードは最初のいくつかのエントリでは機能しますが、スクロールを開始すると失敗するということです。私が使用しているデータでは、名前とヒントが空になることはありません。photoUrlだけが空になる可能性がありますが、それはコードでカバーされています。

このコードが失敗する理由を誰かが知っていますか?

4

1 に答える 1

4

新しいビューホルダーを作成して新しいビューを拡張するコードパスでは、実際にviewHolderをViewsタグに格納することはないため、スクロールして既存のビューを取得すると、view.gettag()はnullを返し、後で試行するとnullが返されます。 ViewHolderを使用すると、NullPointerExceptionが発生します。setTag()への呼び出しを追加する必要があります。

于 2012-07-23T21:47:00.787 に答える