gpt4 book ai didi

java - 使用 ListAdapter 时出现 ArrayIndexOutOfBoundsException

转载 作者:IT老高 更新时间:2023-10-28 20:24:17 25 4
gpt4 key购买 nike

我正在使用自定义 ListAdapter对于 ListView .我没有动态更改任何内容(查看次数、查看类型、启用/禁用,我阅读了其他帖子,但他们从代码中更改了某些内容)。我必须执行以下操作才能触发异常。向下滚动到列表底部,然后再次向上滚动。在向上滚动动画开始时,我得到了这个异常。

04-14 09:41:43.907: ERROR/AndroidRuntime(400): FATAL EXCEPTION: main
04-14 09:41:43.907: ERROR/AndroidRuntime(400): java.lang.ArrayIndexOutOfBoundsException
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:4540)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3370)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.widget.ListView.onTouchEvent(ListView.java:3446)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.View.dispatchTouchEvent(View.java:3885)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.os.Looper.loop(Looper.java:123)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at java.lang.reflect.Method.invokeNative(Native Method)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at java.lang.reflect.Method.invoke(Method.java:507)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-14 09:41:43.907: ERROR/AndroidRuntime(400): at dalvik.system.NativeStart.main(Native Method)

下面是完整的实现。

public class CompanyDetailsAdapter implements ListAdapter {

private Context context;
private LayoutInflater inflater;

private static final class ViewType {
private static final int HEADER = 1;
private static final int TEXT = 2;
private static final int ADDRESS = 3;
private static final int REVIEWS = 4;
private static final int PRODUCTS = 5;
}

//all the cells in the order they appear
private static final class ViewPositions {
private static final int CompanyNameHeader = 0;
private static final int CompanyName = 1;
private static final int ContactHeader = 2;
private static final int Phone = 3;
private static final int Website = 4;
private static final int AddressHeader = 5;
private static final int Address = 6;
private static final int DescriptionHeader = 7;
private static final int Description = 8;
private static final int ReviewsHeader = 9;
private static final int Reviews = 10;
private static final int ProductsHeader = 11;
private static final int Products = 12;
}

//list of cells by types
private static final int[] viewTypes = {
ViewType.HEADER, //0
ViewType.TEXT, //1
ViewType.HEADER, //2
ViewType.TEXT, //3
ViewType.TEXT, //4
ViewType.HEADER, //5
ViewType.ADDRESS, //6
ViewType.HEADER, //7
ViewType.TEXT, //8
ViewType.HEADER, //9
ViewType.REVIEWS, //10
ViewType.HEADER, //11
ViewType.PRODUCTS //12
};

//headers
private static final int[] headerPositions = {
ViewPositions.CompanyNameHeader,
ViewPositions.ContactHeader,
ViewPositions.AddressHeader,
ViewPositions.DescriptionHeader,
ViewPositions.ReviewsHeader,
ViewPositions.ProductsHeader
};

//header resources for position where needed
private static final int[] headerResources = {
R.string.companyName,
0,
R.string.contact,
0,
0,
R.string.address,
0,
R.string.description,
0,
R.string.reviews,
0,
R.string.products,
0
};

//regular texts
private static final int[] textPositions = {
ViewPositions.CompanyName,
ViewPositions.Phone,
ViewPositions.Website,
ViewPositions.Description,
};

public CompanyDetailsAdapter(Context context) {
this.context = context;
this.inflater = LayoutInflater.from(this.context);
}

public int getCount() {
return viewTypes.length;
}

public Object getItem(int position) {
return null;
}

public long getItemId(int position) {
return position+1;
}

public int getItemViewType(int position) {
return viewTypes[position];
}

public View getView(int position, View convertView, ViewGroup parent) {

if (arrayContains(headerPositions, position)) {
LinearLayout layout = null;
TextView txtHeader = null;
if (convertView == null) {
layout = (LinearLayout)inflater.inflate(R.layout.header_listview,parent, false);
} else {
layout = (LinearLayout)convertView;
}
txtHeader = (TextView)layout.findViewById(R.id.txtHeader);
String value = context.getText(headerResources[position]).toString();
txtHeader.setText(value);
return layout;
} else if (arrayContains(textPositions, position)) {
TextView txtText = null;
LinearLayout layout = null;
Company c = Company.getSelectedCompany();
if (convertView == null) {
layout = (LinearLayout)inflater.inflate(R.layout.default_text,parent, false);
} else {
layout = (LinearLayout)convertView;
}
txtText = (TextView)layout.findViewById(R.id.txtNormalText);
switch (position) {
case ViewPositions.CompanyName:
txtText.setText(c.getName());
break;
case ViewPositions.Phone:
txtText.setText(c.getPhone());
break;
case ViewPositions.Website:
txtText.setText(c.getWebsiteString());
break;
case ViewPositions.Description:
txtText.setText(c.getDescription());
break;
}
return layout;
} else {
View v = null;
//LinearLayout layout = null;
Company company = Company.getSelectedCompany();
switch (position) {
case ViewPositions.Address:
if (convertView == null)
v = (LinearLayout)inflater.inflate(R.layout.adress, parent,false);
else
v = (LinearLayout)convertView;

TextView txtAddress = (TextView)v.findViewById(R.id.txtAddress);
txtAddress.setText(String.format("%s %s %s", company.getCity(),
company.getStreet(), company.getPostalCode()));
break;
case ViewPositions.Products:
if (convertView == null)
v = (LinearLayout)inflater.inflate(R.layout.products, parent,false);
else
v = (LinearLayout)convertView;

v = (LinearLayout)inflater.inflate(R.layout.products, parent,false);
TextView txtNumProducts = (TextView)v.findViewById(R.id.txtNumProducts);
txtNumProducts.setText(String.valueOf(company.getNrProducts()));
break;
case ViewPositions.Reviews:
if (convertView == null)
v = (LinearLayout)inflater.inflate(R.layout.reviews, parent,false);
else
v = (LinearLayout)convertView;

v = (LinearLayout)inflater.inflate(R.layout.reviews, parent,false);
TextView txtNumReviews = (TextView)v.findViewById(R.id.txtNumReviews);
txtNumReviews.setText(String.valueOf(company.getNrReviews()));
RatingBar rating = (RatingBar)v.findViewById(R.id.ratAvg);
rating.setRating(company.getAvgRating());
break;
}
return v;
}
}

public int getViewTypeCount() {
return 5;
}

public boolean hasStableIds() {
return true;
}

public boolean isEmpty() {
return false;
}

public void registerDataSetObserver(DataSetObserver arg0) {
}

public void unregisterDataSetObserver(DataSetObserver arg0) {
}

public boolean areAllItemsEnabled() {
return false;
}

public boolean isEnabled(int position) {
if (arrayContains(headerPositions, position)) return false;
return true;
}

private Boolean arrayContains(int[] array, int element) {
for (int i=0; i<array.length; i++) {
if (array[i] == element) return true;
}
return false;
}


}

我将源代码从 here 附加到 Android 2.3.3 库中.我没有发现堆栈跟踪没有向我显示的任何其他内容。大家都知道ListView回收 View 。有一个集合包含这些回收的 View 。当一个 View 消失时,它被添加到那里(我认为)。这发生在 at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:4540)在这里的某个地方,它给了我一个异常(exception),即某些东西超出了范围。我一点头绪都没有。但是我没有耐心调试另外 1000 行代码,所以我想我现在会使用 ScrollView。


似乎是这一行:(AbsListView.class:4540 mScrapViews[viewType].add(scrap); mScrapViews 是 private ArrayList<View>[] mScrapViews; 类型。它是 View 类型列表的数组。我可以尝试观看 viewTypescrap 变量,但它说 errors_during_evaluation 。可能太愚蠢而无法评估。

最佳答案

发现问题。 View 类型必须从 0 开始,我的从 1 开始。

Android 正在使用我提供的 View 类型在某处按索引访问数组。 SomeArraySomewhere[myViewType] 这个数组的大小可能等于 View 类型的数量。所以这意味着我必须从 0 开始我的 View 类型。

关于java - 使用 ListAdapter 时出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com