关于listview加载多种item的解决方案

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



private class MyCustomAdapter extends BaseAdapter {
 
        private static final int TYPE_ITEM = 0;
        private static final int TYPE_SEPARATOR = 1;
        private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
 
        private ArrayList mData = new ArrayList();
        private LayoutInflater mInflater;
 
        private TreeSet mSeparatorsSet = new TreeSet();
 
        public MyCustomAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
 
        public void addItem(final String item) {
            mData.add(item);
            notifyDataSetChanged();
        }
 
        public void addSeparatorItem(final String item) {
            mData.add(item);
            // save separator position
            mSeparatorsSet.add(mData.size() - 1);
            notifyDataSetChanged();
        }
 
        @Override
        public int getItemViewType(int position) {
            return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
        }
 
        @Override
        public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }
 
        @Override
        public int getCount() {
            return mData.size();
        }
 
        @Override
        public String getItem(int position) {
            return mData.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = getItemViewType(position);
            System.out.println("getView " + position + " " + convertView + " type = " + type);
            if (convertView == null) {
                holder = new ViewHolder();
                switch (type) {
                    case TYPE_ITEM:
                        convertView = mInflater.inflate(R.layout.item1, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.text);
                        break;
                    case TYPE_SEPARATOR:
                        convertView = mInflater.inflate(R.layout.item2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }
 
    }
 
    public static class ViewHolder {
        public TextView textView;
    }
}



今天遇到了一个问题

01-08 22:54:27.758: E/AndroidRuntime(1641): java.lang.ArrayIndexOutOfBoundsException: length=11; index=11
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:7127)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.ListView.layoutChildren(ListView.java:1565)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.AbsListView.onLayout(AbsListView.java:2307)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1644)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1428)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1644)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1428)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.View.layout(View.java:14101)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewGroup.layout(ViewGroup.java:4657)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2005)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1826)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1121)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4598)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.Choreographer.doCallbacks(Choreographer.java:555)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.Choreographer.doFrame(Choreographer.java:525)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.os.Handler.handleCallback(Handler.java:615)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.os.Handler.dispatchMessage(Handler.java:92)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.os.Looper.loop(Looper.java:137)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at android.app.ActivityThread.main(ActivityThread.java:4921)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-08 22:54:27.758: E/AndroidRuntime(1641): 	at java.lang


看着是数组越界了,但是一直找不到原因,最终在这里找到了出错的源头

http://stackoverflow.com/questions/2596547/arrayindexoutofboundsexception-with-custom-android-adapter-for-multiple-views-in

getItemViewType() is >= getViewTypeCount().

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值