recyclerview jakewharton injectview implementar butter java android annotations baseadapter butterknife

java - jakewharton - El uso de la cuchilla de mantequilla en los resultados de subclases del adaptador de base personalizado en el error "No se puede inyectar vistas"



implementar butterknife (5)

Estoy intentando usar Butter Knife para simplificar la creación de una clase personalizada de BaseAdapter. Estoy siguiendo el ejemplo aquí: http://jakewharton.github.io/butterknife/ bajo "Otro uso es simplificar el patrón del titular de la vista dentro de un adaptador de lista". sección. Desafortunadamente, recibo el error "No se pueden inyectar vistas" cada vez que se crea el ViewHolder para cada elemento de la lista.

Aquí está mi código:

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()); L.l("ArrayAdapterName", ((Name)getItem(position)).GetID() + " inserted in list | position = " + position); viewHolder.imageButtonDeleteName.setTag((Name)getItem(position)); return convertView; }

}

El error ocurre en "ButterKnife.Inject (this, view)"; línea. También sucede cada vez que se crea el titular de la vista para cada elemento que estoy poniendo en la lista. ¿Alguien sabe cómo hacer que esto funcione como debería?

En respuesta al comentario de Jake Wharton Primero, permítame decirle gracias por desarrollar esta herramienta. Ha hecho que el desarrollo de Android sea mucho más agradable de lo que era cuando comencé.

Aquí está el stacktrace completo:

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)


Aquellos que aún lo están viendo, suceden si intentan enlazar un tipo de Vista incorrecto desde XML en el archivo Java.

Por ejemplo

Tienes TextView con resultado de identificación

<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" />

Y tratas de enlazarlo con el botón en el archivo java.

Resultado del botón @BindView (R.id.result);

Se te ha caído la aplicación.

Butterknife lanzará una excepción para el lanzamiento ilegal de vistas porque no se puede inyectar el error de vista


Compruebe si su @InjectView s tiene el tipo correcto. He usado ImageView lugar de LinearLayout . Ese podría ser tu problema también.

Actualizar:

Asegúrate de que no estás utilizando @OnItemClick(R.id.non_list_view) con un ListView . Lo estaba usando para un android.support.v7.widget.RecyclerView que estaba causando la siguiente excepción:

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


Para mí, resultó que el ViewBinder no se actualizó correctamente. Una construcción de proyecto limpia resolvió este problema.


También verifica si estás inflando el R.layout. correcto R.layout. expediente. Si no es así, no se encuentran las vistas necesarias y se produce este error.


Tuve un problema similar con ButterKnife, pero la razón era que estaba inflando mi fragmento con el diseño incorrecto.

( Sé que la pregunta ya estaba respondida, pero decidí publicar mi solución en caso de que alguien tuviera el mismo problema )