我正在使用不同的项目膨胀来处理Recyceview.当我没有绑定RecycleView的onBindViewHolder方法上的数据时它不会崩溃.. 但是当我绑定onBindViewHolder中的数据而不是我得到异常时,请检查我的代码并让
但是当我绑定onBindViewHolder中的数据而不是我得到异常时,请检查我的代码并让我知道我在哪里做错了.
package com.tv.practise.adapter; /** Created by Ravindra Kushwaha on 10/10/16. */ public class RecycleDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private ArrayList<RecycleBen> data; public static class SimpleText extends RecyclerView.ViewHolder { TextView first_data_tv; public SimpleText(View v) { super(v); this.first_data_tv = (TextView) v.findViewById(R.id.first_data_tv); } } public class SimpleImage extends RecyclerView.ViewHolder { ImageView second_data_iv; public SimpleImage(View v) { super(v); this.second_data_iv = (ImageView) v.findViewById(R.id.second_data_iv); } } public class SimpleImageWithText extends RecyclerView.ViewHolder { TextView third_data_tv; ImageView third_iv; public SimpleImageWithText(View v) { super(v); this.third_data_tv = (TextView) v.findViewById(R.id.third_data_tv); this.third_iv = (ImageView) v.findViewById(R.id.third_iv); } } public RecycleDataAdapter(Context mContext, ArrayList<RecycleBen> data) { this.mContext = mContext; this.data = data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { int listViewItemType = getItemViewType(viewType); View itemView; if(listViewItemType==1) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_first_item, parent, false); return new SimpleText(itemView ); } else if(listViewItemType==2) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_fsecond_item, parent, false); return new SimpleImage(itemView); } else { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_third_item, parent, false); return new SimpleImageWithText(itemView); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { RecycleBen bean = data.get(position); if(holder.getItemViewType()==1) { /////HERE I AM GETTING THE EXCEPTION WHILE BINDIND DATA ((SimpleText)holder).first_data_tv.setText(bean.getName()); } else if(holder.getItemViewType()==2) { } else { /////HERE I AM GETTING THE EXCEPTION WHILE BINDIND DATA((SimpleImageWithText)holder).third_data_tv.setText(bean.getName()); } } @Override public int getItemViewType(int position) { return Integer.parseInt(data.get(position).getType_row()); } @Override public int getItemCount() { return data.size(); } }
我绑定数据时的例外情况如下: –
3758-3758/com.tv.practise E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.tv.practise, PID: 3758 java.lang.ClassCastException: com.tv.practise.adapter.RecycleDataAdapter$SimpleImageWithText cannot be cast to com.tv.practise.adapter.RecycleDataAdapter$SimpleText at com.tv.practise.adapter.RecycleDataAdapter.onBindViewHolder(RecycleDataAdapter.java:101) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) at android.view.View.measure(View.java:18804) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2112) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1228) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1464) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)原因是isCreateViewHolder(ViewGroup parent,int viewType).参数是视图类型,但不是位置.使用int listViewItemType = getItemViewType(viewType)不正确,因为位置应该传递给getItemViewType.
简而言之,您应该直接使用viewType并删除onCreateViewHolder中的listViewItemType.