バターナイフを使用して、カスタムBaseAdapterクラスの作成を簡素化しようとしています。私はここで例に従っています: http://jakewharton.github.io/butterknife/ 「別の使用法は、リストアダプター内のビューホルダーパターンを単純化すること」です。セクション。残念ながら、リスト内の各アイテムに対してViewHolderが作成されるたびに、「ビューを挿入できません」というエラーが表示されます。
ここに私のコードがあります:
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;
}
}
エラーは「ButterKnife.Inject(this、view);」で発生しますライン。また、リストに入れているアイテムごとにビューホルダーが作成されるたびに発生します。誰もがこの仕事を本来のやり方にする方法を知っていますか?
Jake Whartonのコメントへの返信で、まず、このツールを開発してくれてありがとう。 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)
_@InjectView
_ sのタイプが正しいかどうかを確認してください。 ImageView
の代わりにLinearLayout
を使用しました。それもあなたの問題かもしれません。
更新:
ListView
以外でButterKnifeの@OnItemClick(R.id.non_list_view)
を使用していないことを確認してください。私はそれを次の例外を引き起こしていた_Android.support.v7.widget.RecyclerView
_に使用していました:
_Java.lang.RuntimeException: Unable to inject views for MyFragment{... id=.... Android:switcher:...}
_
また、正しいR.layout.
ファイル。そうでない場合-必要なビューが見つからず、このエラーが発生します。
ButterKnifeでも同様の問題がありましたが、その理由は、間違ったレイアウトでフラグメントを膨らませていたためです。
(質問がすでに回答されていることは知っていますが、同じ問題が発生した場合に備えてソリューションを投稿することにしました)
私にとっては、ViewBinder
が正しく更新されなかったことがわかりました。 クリーンなプロジェクトビルドがこの問題を解決しました。
Java file itでXMLから間違ったビュータイプをバインドしようとすると、まだ見ている人がいます。
例えば
結果がidのTextViewがあります
<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 fileのボタンでそれをバインドしようとします
@BindView(R.id.result)ボタンの結果;
アプリがクラッシュしました。
Butterknifeは、ビューエラーを挿入できないとしてビューを不正にキャストすると例外をスローします