Java 使用multipleview和毕加索时如何从适配器强制转换元素
使用Java 使用multipleview和毕加索时如何从适配器强制转换元素,java,android,Java,Android,使用MultipleView和Picasso时,如何在适配器内投射CircleImageView元素 我在适配器内创建了一个MultipleView,以区分显示的视图。当我只显示TextView时,一切都运行正常,没有错误。但是当使用CircleImageView时,我在这样一个应用程序上遇到了一个错误: Process: com.bertho.chat, PID: 2731 java.lang.ClassCastException: com.bertho.chat.Adapter.Adapte
MultipleView
和Picasso
时,如何在适配器内投射CircleImageView
元素
我在适配器内创建了一个MultipleView
,以区分显示的视图。当我只显示TextView
时,一切都运行正常,没有错误。但是当使用CircleImageView
时,我在这样一个应用程序上遇到了一个错误:
Process: com.bertho.chat, PID: 2731
java.lang.ClassCastException: com.bertho.chat.Adapter.AdapterMessage$RightBubbleMessage cannot be cast to com.bertho.chat.Adapter.AdapterMessage$LeftBubbleMessage
at com.bertho.chat.Adapter.AdapterMessage.onBindViewHolder(AdapterMessage.java:113)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6477)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6510)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5453)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5719)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5558)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5554)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:618)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3694)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3411)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3963)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2685)
at android.view.View.layout(View.java:16722)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2175)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1935)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1111)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6017)
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:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:234)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$M
profileImage = (CircleImageView) view.findViewById( R.id.message_profile_layout );
我的适配器:
public class AdapterMessage extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<Messages> mMessageList;
public class LeftBubbleMessage extends RecyclerView.ViewHolder {
public TextView messageText;
public CircleImageView profileImage;
public LeftBubbleMessage(View view) {
super( view );
messageText = (TextView) view.findViewById( R.id.message_text_layout );
profileImage = (CircleImageView) view.findViewById( R.id.message_profile_layout );
}
}
public class RightBubbleMessage extends RecyclerView.ViewHolder {
public TextView messageText;
public CircleImageView profileImage;
public RightBubbleMessage(View view) {
super( view );
messageText = (TextView) view.findViewById( R.id.message_text_layout );
profileImage = (CircleImageView) view.findViewById( R.id.message_profile_layout );
}
}
public AdapterMessage(Context mContext, List<Messages> mMessageList) {
this.mContext = mContext;
this.mMessageList = mMessageList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
if (viewType == 1) {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_left, parent, false );
return new LeftBubbleMessage( itemView );
} else {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_right, parent, false );
return new RightBubbleMessage( itemView );
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final Messages msg = mMessageList.get( position );
if (holder.getItemViewType() == 1) {
((LeftBubbleMessage) holder).messageText.setText( msg.getMessage() );
Log.i( "ON_BIND", msg.getProfile_pic().toString() );
Picasso.with( mContext )
.load( msg.getProfile_pic() )
.placeholder( R.drawable.no_profile )
.into( ((LeftBubbleMessage) holder).profileImage );
} else {
((RightBubbleMessage) holder).messageText.setText( msg.getMessage() );
Log.i( "ON_BIND", msg.getProfile_pic().toString() );
Picasso.with( mContext )
.load( msg.getProfile_pic() )
.placeholder( R.drawable.no_profile )
.into( ((LeftBubbleMessage) holder).profileImage );
}
}
@Override
public int getItemViewType(int position) {
return mMessageList.get( position ).getTypeMsg();
}
@Override
public int getItemCount() {
return mMessageList.size();
}
}
谢谢你的建议我的错误。。。谢谢@Ram Prakash Bhat
我看不出这句话:
.into( ((LeftBubbleMessage) holder).profileImage );
在else
部分中,应该是RightBubbleMessage
而不是LeftBubbleMessage
,OOD解决方案是创建一个抽象类BubbleMessage Extendes RecyclerView.ViewHolder
并在左类和右类中扩展它,并将字段上移
但是,只要字段具有相同的ID和相同的逻辑(正如我从代码中看到的那样),就可以简单地对两个不同的布局使用相同的ViewHolder类
这:
}
将变成这样:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
if (viewType == 1) {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_left, parent, false );
} else {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_right, parent, false );
}
return new BubbleMessage( itemView );
}为什么要使用LeftBubbleMessage;还有其他部分吗?这是真实的issue@RamPrakashBhat哦,天哪……我错了(谢谢@Nick提供的解决方案……我会试试的。)
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
if (viewType == 1) {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_left, parent, false );
} else {
itemView = LayoutInflater.from( parent.getContext() )
.inflate( R.layout.message_single_layout_right, parent, false );
}
return new BubbleMessage( itemView );