我有一个正在使用的分段适配器,但是我正在尝试修改它,以便使用 if (section.adapter.getCount() > 0) 如果它们为空,则不会出现这些部分。我有以下课程:
abstract public class SectionedAdapter extends BaseAdapter {
abstract protected View getHeaderView(String caption, int index, View convertView, ViewGroup parent);
private List<Section> sections = new ArrayList<Section>();
private static int TYPE_SECTION_HEADER = 0;
public SectionedAdapter() {
super();
}
public void addSection(String caption, Adapter adapter) {
sections.add(new Section(caption, adapter));
}
public void clear() {
sections.clear();
notifyDataSetInvalidated();
}
@Override
public Object getItem(int position) {
for (Section section : this.sections) {
if (section.adapter.getCount() > 0) {
if (position == 0) {
return section;
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return section.adapter.getItem(position - 1);
}
position -= size;
}
}
return null;
}
@Override
public int getCount() {
int total = 0;
for (Section section : this.sections) {
if (section.adapter.getCount() > 0) {
// Add Header and Section
total += section.adapter.getCount() + 1;
}
}
return total;
}
@Override
public int getViewTypeCount() {
int total = 1; // Add Header
for (Section section : this.sections) {
if (section.adapter.getCount() > 0) {
// Add Sections
total += section.adapter.getViewTypeCount();
}
}
return total;
}
@Override
public int getItemViewType(int position) {
int typeOffset = TYPE_SECTION_HEADER + 1;
for (Section section : this.sections) {
if (section.adapter.getCount() > 0) {
if (position == 0) {
return TYPE_SECTION_HEADER;
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return (typeOffset + section.adapter.getItemViewType(position - 1));
}
position -= size;
typeOffset += section.adapter.getViewTypeCount();
}
}
return Adapter.IGNORE_ITEM_VIEW_TYPE;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (getItemViewType(position) != TYPE_SECTION_HEADER);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int sectionIndex = 0;
for (Section section : this.sections) {
if (section.adapter.getCount() > 0) {
if (position == 0) {
return getHeaderView(section.caption, sectionIndex, null, parent);
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return section.adapter.getView(position - 1, null, parent);
}
position -= size;
sectionIndex++;
}
}
return null;
}
@Override
public long getItemId(int position) {
return position;
}
class Section {
String caption;
Adapter adapter;
Section(String caption, Adapter adapter) {
this.caption = caption;
this.adapter = adapter;
}
}
}
这是可行的,但有时它会因 AbsListView$RecycleBin.addScrapView() 中的错误 ArrayIndexOutOfBoundsException 而崩溃
java.lang.ArrayIndexOutOfBoundsException
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:4186)
at android.widget.ListView.layoutChildren(ListView.java:1572)
at android.widget.AbsListView.onLayout(AbsListView.java:1172)
at android.view.View.layout(View.java:7037)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
at android.view.View.layout(View.java:7037)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:7037)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:7037)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1054)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1736)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
我知道这个错误很可能与 getViewTypeCount() 或 getItemViewType(int position) 有关,但我不知道哪里出错了(由于其他 StackOverflow 搜索)。异常不会可靠地发生,所以我不知道为什么会发生这种情况。我在这里错过了什么吗?