Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用multipleview和毕加索时如何从适配器强制转换元素_Java_Android - Fatal编程技术网

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