您的位置:首页 > 其它

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

2013-12-16 13:49 429 查看
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().
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: