2014-05-03 13 views
20

Tôi đang cố sử dụng Butter Knife để đơn giản hóa việc tạo lớp BaseAdapter tùy chỉnh. Tôi đang làm theo ví dụ ở đây: http://jakewharton.github.io/butterknife/ trong phần "Sử dụng khác là đơn giản hóa mô hình trình giữ bên trong bộ điều hợp danh sách". phần. Thật không may, tôi nhận được lỗi "Không thể chèn lượt xem" mỗi khi ViewHolder được tạo cho từng mục trong danh sách.Sử dụng dao cắt bơ trong kết quả SubClass tùy chỉnh BaseAdapter trong lỗi "Không thể chèn lượt xem"

Đây là mã của tôi:

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

}

Các lỗi xảy ra tại "ButterKnife.Inject (this, view);" hàng. Điều này cũng xảy ra mỗi khi người giữ chế độ xem được tạo cho từng mục tôi đang đưa vào danh sách. Có ai biết làm thế nào để làm cho công việc này theo cách nó nên?

Trả lời nhận xét của Jake Wharton Trước tiên, hãy để tôi nói lời cảm ơn vì đã phát triển công cụ này. Nó đã làm cho phát triển Android thú vị hơn nhiều so với khi tôi mới bắt đầu.

Đây là stacktrace hoàn chỉnh:

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

Dán toàn bộ dấu vết ngăn xếp. –

Trả lời

45

Kiểm tra nếu @InjectView của bạn có đúng loại. Tôi đã sử dụng ImageView thay vì LinearLayout. Đó cũng có thể là vấn đề của bạn.

Cập nhật:

Hãy chắc chắn rằng bạn không sử dụng ButterKnife của @OnItemClick(R.id.non_list_view) với một tổ chức phi ListView. Tôi đã sử dụng nó cho một android.support.v7.widget.RecyclerView nhưng lại gây sau ngoại lệ:

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

Đó là nó. Tôi không thể tin rằng tôi đã bỏ lỡ nó. Cảm ơn. – reggie3

3

Tôi đã có một vấn đề tương tự với ButterKnife, nhưng lý do là tôi đã được thổi phồng đoạn của tôi với cách bố trí sai.

(Tôi biết các câu hỏi đã được trả lời, nhưng tôi quyết định gửi giải pháp của tôi trong trường hợp ai đó có cùng một vấn đề)

+0

Đây không phải là giải pháp – jskierbi

6

Ngoài ra kiểm tra nếu bạn đang lạm phát đúng R.layout. tập tin. Nếu không - các khung nhìn cần thiết không được tìm thấy và lỗi này xảy ra.

0

Những người vẫn đang tìm kiếm nó sẽ xảy ra nếu bạn đang cố gắng ràng buộc sai Loại xem từ XML trong tệp Java nó.

Ví dụ

Bạn có TextView với id kết quả

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

Và bạn cố gắng để ràng buộc nó với nút trong file java

@BindView (R.id.result) Kết quả nút;

Ứng dụng bạn gặp sự cố.

Butterknife sẽ ném ngoại lệ cho đúc bất hợp pháp các quan điểm như Không thể Tiêm Xem Lỗi

1

Đối với tôi nó bật ra rằng ViewBinder là không chính xác làm mới. Một dự án xây dựng sạch sẽ giải quyết được vấn đề này.

Các vấn đề liên quan