在自定义BaseAdapter子类中使用黄油刀导致“无法注入视图”错误

我正在尝试使用Butter Knife来简化自定义BaseAdapter类的创build。 我在这里的例子: http : //jakewharton.github.io/butterknife/下的“另一个用途是简化视图持有人模式内的列表适配器。 部分。 不幸的是,每次为列表中的每个项目创buildViewHolder时,都会收到“Unable to inject views”错误。

这是我的代码:

public class ButterknifeCustomBaseAdapter extends BaseAdapter{ @Override public int getCount() { return arrayListNames.size(); } @Override public Name getItem(int iPosition) { return arrayListNames.get(iPosition); } @Override public long getItemId(int iID) { return 0; } LayoutInflater inflater; ArrayList<Name> arrayListNames = new ArrayList<Name>(); static Context context; Activity activity; public ButterknifeCustomBaseAdapter(Context context, ArrayList<Name> names, Activity activity) { arrayListNames = names; this.context = context; inflater = LayoutInflater.from(this.context); } static class ViewHolder implements View.OnClickListener { @InjectView(R.id.textViewFullName) TextView textViewFullName; @InjectView(R.id.imageButtonDeleteName) TextView imageButtonDeleteName; @OnClick(R.id.imageButtonDeleteName) public void onClick(View view) { ((NameActivity)context).DeleteUser((Name)view.getTag()); } public ViewHolder(View view) { ButterKnife.inject(this, view); } } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView != null) { viewHolder = (ViewHolder) convertView.getTag(); } else { convertView = inflater.inflate(R.layout.item_name, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } viewHolder.textViewFullName.setText(((Name)getItem(position)).GetFullName()); Ll("ArrayAdapterName", ((Name)getItem(position)).GetID() + " inserted in list | position = " + position); viewHolder.imageButtonDeleteName.setTag((Name)getItem(position)); return convertView; } 

}

错误发生在“ButterKnife.Inject(this,view);” 线。 每当我为列表中的每个项目创build查看者时,也会发生这种情况。 有没有人知道如何使这个工作的方式?

在回复杰克·沃顿的评论首先,让我说谢谢你开发这个工具。 它使得android开发比我刚开始的时候更加愉快。

这是完整的堆栈跟踪:

 05-04 07:29:01.991 2424-2424/com.murach.databasehomework E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to inject views for com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder@52700878 at butterknife.ButterKnife.inject(ButterKnife.java:221) at butterknife.ButterKnife.inject(ButterKnife.java:184) at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.java:59) at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70) at android.widget.AbsListView.obtainView(AbsListView.java:2177) at android.widget.ListView.makeAndAddView(ListView.java:1840) at android.widget.ListView.fillDown(ListView.java:675) at android.widget.ListView.fillFromTop(ListView.java:736) at android.widget.ListView.layoutChildren(ListView.java:1655) at android.widget.AbsListView.onLayout(AbsListView.java:2012) at android.view.View.layout(View.java:14289) at android.view.ViewGroup.layout(ViewGroup.java:4562) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076) at android.view.View.layout(View.java:14289) at android.view.ViewGroup.layout(ViewGroup.java:4562) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:14289) at android.view.ViewGroup.layout(ViewGroup.java:4562) at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349) at android.view.View.layout(View.java:14289) at android.view.ViewGroup.layout(ViewGroup.java:4562) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:14289) at android.view.ViewGroup.layout(ViewGroup.java:4562) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) at android.view.Choreographer.doCallbacks(Choreographer.java:562) at android.view.Choreographer.doFrame(Choreographer.java:532) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at butterknife.ButterKnife.inject(ButterKnife.java:216)            at butterknife.ButterKnife.inject(ButterKnife.java:184)            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.java:59)            at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70)            at android.widget.AbsListView.obtainView(AbsListView.java:2177)            at android.widget.ListView.makeAndAddView(ListView.java:1840)            at android.widget.ListView.fillDown(ListView.java:675)            at android.widget.ListView.fillFromTop(ListView.java:736)            at android.widget.ListView.layoutChildren(ListView.java:1655)            at android.widget.AbsListView.onLayout(AbsListView.java:2012)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)            at android.view.Choreographer.doCallbacks(Choreographer.java:562)            at android.view.Choreographer.doFrame(Choreographer.java:532)            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)            at android.os.Handler.handleCallback(Handler.java:730)            at android.os.Handler.dispatchMessage(Handler.java:92)            at android.os.Looper.loop(Looper.java:137)            at android.app.ActivityThread.main(ActivityThread.java:5103)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:525)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)            at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassCastException: android.widget.ImageButton cannot be cast to android.widget.TextView at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.inject(ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.java:13)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:525)            at butterknife.ButterKnife.inject(ButterKnife.java:216)            at butterknife.ButterKnife.inject(ButterKnife.java:184)            at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.<init>(ButterknifeCustomBaseAdapter.java:59)            at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70)            at android.widget.AbsListView.obtainView(AbsListView.java:2177)            at android.widget.ListView.makeAndAddView(ListView.java:1840)            at android.widget.ListView.fillDown(ListView.java:675)            at android.widget.ListView.fillFromTop(ListView.java:736)            at android.widget.ListView.layoutChildren(ListView.java:1655)            at android.widget.AbsListView.onLayout(AbsListView.java:2012)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)            at android.view.View.layout(View.java:14289)            at android.view.ViewGroup.layout(ViewGroup.java:4562)            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)            at android.view.Choreographer.doCallbacks(Choreographer.java:562)            at android.view.Choreographer.doFrame(Choreographer.java:532)            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)            at android.os.Handler.handleCallback(Handler.java:730)            at android.os.Handler.dispatchMessage(Handler.java:92)            at android.os.Looper.loop(Looper.java:137)            at android.app.ActivityThread.main(ActivityThread.java:5103)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:525)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)            at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "在自定义BaseAdapter子类中使用黄油刀导致“无法注入视图”错误"

检查你的@InjectView是否有正确的types。 我使用ImageView而不是LinearLayout 。 这可能也是你的问题。

更新:

确保你没有使用ButterKnife的@OnItemClick(R.id.non_list_view)和一个非ListView 。 我正在使用它的android.support.v7.widget.RecyclerView这是造成以下exception:

 java.lang.RuntimeException: Unable to inject views for MyFragment{... id=.... android:switcher:...} 

另外检查你是否膨胀正确的R.layout. 文件。 如果没有 – 必要的视图没有find,并发生此错误。

我和ButterKnife有类似的问题,但是原因是我用错误的布局来扩充我的片段。

我知道这个问题已经回答了,但是我决定发布我的解决scheme,以防有人遇到同样的问题

对我来说,事实certificate, ViewBinder没有正确刷新。 一个干净的项目build设解决了这个问题。

那些仍然在寻找它的人会发生,如果你试图绑定错误的视图types从XML文件中的Java文件。

例如

你有TextView id结果

  <TextView android:id="@+id/result" android:layout_width="match_parent" android:layout_height="0dp" android:gravity="center" android:layout_centerHorizontal="true" android:layout_margin="3dp" android:layout_weight="2" android:background="#fff" android:text="Calculator" android:textSize="25sp" /> 

而你试图用java中的Button来绑定它

@BindView(R.id.result)button结果;

它崩溃了你的应用程序。

Butterknife将抛出exception非法转换视图为无法注入视图错误