我需要获取一直点击的商品的ID。因此,在bindView中,我通过holder.layout.setTag(id)将id设置为viewHolder,在onClick中,我通过view.getTag获得了该值。当我刚运行它时,此代码运行良好,但是当我在一些项目应用崩溃时开始滚动它时,在日志中,我可以在bindView中看到ClassCastException javaLanString。因此,没有这些setTag和getTag代码就可以完美工作。
几个小时后,我试图弄清楚为什么会出现ClassCastException,但没有找到答案。你有想法吗?
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
String value = cursor.getString(itemId);
Log.i("MINE", value);
holder.layout.setTag(value);
holder.name.setText(cursor.getString(itemName));
holder.country.setText(cursor.getString(itemCountry));
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = inflater.inflate(com.home.R.layout.item_list_row,
parent, false);
ViewHolder holder = new ViewHolder(
(TextView) view.findViewById(com.home.R.id.item_row_name),
(TextView) view.findViewById(com.home.R.id.item_row_population),
(TextView) view.findViewById(com.home.R.id.item_row_country),
(ImageView) view.findViewById(com.home.R.id.icon),
(View) view.findViewById(R.id.row_item));
view.setTag(holder);
view.setOnClickListener(this);
return view;
}
private static final class ViewHolder {
final TextView name;
final TextView population;
final TextView country;
final ImageView icon;
final View layout;
public ViewHolder(TextView name, TextView population, TextView country,
ImageView icon, View layout) {
this.name = name;
this.population = population;
this.country = country;
this.icon = icon;
this.layout = layout;
}
}
编辑:我在这一行中看到错误ViewHolderholder =(ViewHolder)view.getTag();下面我放了stacktrace来显示错误发生的地方
09-15 13:35:21.586:ERROR / AndroidRuntime(2175):致命异常:主要
09-15 13:35:21.586:ERROR / AndroidRuntime(2175):java.lang.ClassCastException:java.lang.String
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.dataart.representation.ItemsAdapter.bindView(ItemsAdapter.java:38)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.CursorAdapter.getView(CursorAdapter.java:186)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.AbsListView.obtainView(AbsListView.java:1397)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.addViewBelow(ListView.java:2914)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.scrollListItemsBy(ListView.java:2843)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.arrowScrollImpl(ListView.java:2340)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.arrowScroll(ListView.java:2287)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.commonKey(ListView.java:2089)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.onKeyDown(ListView.java:2036)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.KeyEvent.dispatch(KeyEvent.java:1256)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.View.dispatchKeyEvent(View.java:3855)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:787)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.widget.ListView.dispatchKeyEvent(ListView.java:2021)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.android.internal.policy.impl.PhoneWindow $ DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.app.Activity.dispatchKeyEvent(Activity.java:2073)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.os.Handler.dispatchMessage(Handler.java:99)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.os.Looper.loop(Looper.java:123)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于android.app.ActivityThread.main(ActivityThread.java:3647)
09-15 13:35:21.586:ERROR / AndroidRuntime(2175):位于java.lang.reflect.Method.invokeNative(本机方法)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):位于java.lang.reflect.Method.invoke(Method.java:507)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-15 13:35:21.586:错误/ AndroidRuntime(2175):在dalvik.system.NativeStart.main(本机方法)
最佳答案
您正在使用setTag()
调用String
,覆盖您先前使用setTag()
执行的ViewHolder
。
您无需使用setTag()
调用String
。您可以随时通过在_ID
上调用getItemId()
来获取CursorAdapter
值。
如果发现该答案不可接受,则将long id
数据成员添加到ViewHolder
并将_ID
放在此处。
关于android - 在CursorAdapter中滚动会导致崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7428816/