2014-05-03 23 views
20

Ich versuche Buttermesser zu verwenden, um die Erstellung einer benutzerdefinierten BaseAdapter-Klasse zu vereinfachen. Ich folge dem Beispiel hier: http://jakewharton.github.io/butterknife/ unter der "Eine andere Verwendung vereinfacht die Ansicht Halter Muster in einem Listenadapter." Sektion. Leider bekomme ich jedes Mal, wenn der ViewHolder für jedes Element in der Liste erstellt wird, den Fehler "Fehler beim Einfügen von Ansichten".Verwenden von Butter Knife in benutzerdefinierten BaseAdapter SubClass Ergebnisse in "Kann Ansichten nicht einspeisen" Fehler

Hier ist mein Code:

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

}

Der Fehler beim geschieht "ButterKnife.Inject (this, Ansicht);" Linie. Es passiert auch jedes Mal, wenn der Ansichtshalter für jeden Eintrag erstellt wird, den ich in die Liste einfüge. Weiß jemand, wie man das so macht, wie es soll?

Als Antwort auf Jake Whartons Kommentar Zunächst möchte ich Ihnen für die Entwicklung dieses Tools danken. Es hat die Android-Entwicklung viel angenehmer gemacht als zu Beginn.

Dies ist die komplette Stack Trace:

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

Fügen Sie den gesamten Stack-Trace ein. –

Antwort

45

Überprüfen Sie, ob Ihr @InjectView s richtigen Typ hat. Ich habe ImageView anstelle von LinearLayout verwendet. Das könnte auch dein Problem sein.

Update:

Stellen Sie sicher, Sie verwenden nicht butter der @OnItemClick(R.id.non_list_view) mit einem nicht ListView. Ich benutze es für ein android.support.v7.widget.RecyclerView die folgende Ausnahme verursacht wurde:

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

Das war es. Ich kann nicht glauben, dass ich es verpasst habe. Vielen Dank. – reggie3

3

ich ein ähnliches Problem mit Buttermesser hatte, aber der Grund war, dass ich mein Fragment mit dem falschen Layout wurde aufgeblasen wird.

(Ich weiß, die Frage wurde bereits beantwortet, aber ich beschloss, meine Lösung für den Fall zu schreiben jemand das gleiche Problem hatte)

+0

Dies ist keine Lösung – jskierbi

6

Prüfen Sie auch, ob Sie richtig R.layout. Datei aufblasen. Wenn nicht, werden notwendige Ansichten nicht gefunden und dieser Fehler tritt auf.

0

Diejenigen, die immer noch suchen, passiert, wenn Sie versuchen, falsche Ansichtstyp aus XML in Java-Datei zu binden.

Zum Beispiel

Sie haben Textview mit der ID Ergebnis

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

Und Sie versuchen, es zu binden, mit Knopf in Java-Datei

@BindView (R.id.result) Tastenergebnis;

Es stürzte Sie App.

Buttermesser wird Ausnahme für illegale Gießen von Ansichten, wie kann nicht werfen View Error

1

Für mich spritzen es stellte sich heraus, dass die ViewBinder nicht richtig aufgefrischt wurde. Ein sauberer Projekt-Build hat dieses Problem gelöst.