2014-05-03 9 views
20

Sto tentando di utilizzare Butter Knife per semplificare la creazione di una classe BaseAdapter personalizzata. Sto seguendo l'esempio qui: http://jakewharton.github.io/butterknife/ in "Un altro uso è la semplificazione del modello di supporto di visualizzazione all'interno di un adattatore di elenco". sezione. Sfortunatamente, ricevo un errore "Impossibile iniettare viste" ogni volta che viene creato ViewHolder per ciascun elemento nell'elenco.Utilizzo di Butter Knife in Custom BaseAdapter Risultati sottoclasse in errore "Impossibile iniettare viste"

Ecco il mio codice:

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; 
} 

}

L'errore avviene a "ButterKnife.Inject (questo, vista);" linea. Succede anche ogni volta che il titolare della vista viene creato per ogni oggetto che inserisco nell'elenco. Qualcuno sa come farlo funzionare nel modo giusto?

In risposta al commento di Jake Wharton Innanzitutto, vorrei dire grazie per aver sviluppato questo strumento. Ha reso lo sviluppo di Android molto più piacevole di quello che era quando ho iniziato.

Ecco la 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.[email protected]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) 
+0

Incollare l'intera traccia dello stack. –

risposta

45

di controllare se le @InjectView s è tipo corretto. Ho usato ImageView anziché LinearLayout. Potrebbe essere anche il tuo problema.

Aggiornamento:

Assicurarsi che non si utilizza di butterknife @OnItemClick(R.id.non_list_view) con un non ListView. Mi è stato usato per un android.support.v7.widget.RecyclerView, che stava causando seguente eccezione:

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

Era così. Non posso credere di averlo perso. Grazie. – reggie3

3

Ho avuto un problema simile con butterknife, ma il motivo era che stavo gonfiare il mio frammento con il layout sbagliato.

(So che la questione era già risposto, ma ho deciso di pubblicare la mia soluzione nel caso in cui qualcuno ha avuto lo stesso problema)

+0

Questa non è una soluzione – jskierbi

6

Controlla anche se si sta gonfiando file corretto R.layout.. In caso contrario - le viste necessarie non vengono trovate e si verifica questo errore.

0

Quelli che stanno ancora guardando succede se si sta tentando di associare errato tipo di vista da XML in file Java.

Per esempio

Hai TextView con esito 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" /> 

E si tenta di associare con Button nella file di java

@BindView (R.id.result) Risultato del pulsante;

È andato in crash si app.

butterknife getterà eccezione per la fusione illegale di vista come Impossibile Iniettare Visualizza errore

1

Per me si è scoperto che il ViewBinder non era correttamente aggiornata. Un progetto pulito-build ha risolto questo problema.

Problemi correlati