android-如何在聊天应用上使用不同类型的消息来组织RecyclerView?

android-如何在聊天应用上使用不同类型的消息来组织RecyclerView?,第1张

概述我开发了聊天应用程序,有不同类型的消息:简单的文本,图像,文件等.也只有消息(其他在屏幕左侧)和我的消息(在屏幕右侧).现在,每种消息类型都有不同的布局:>item_message_simple>item_my_message_simple>item_message_image>item_my_message_image>item_message_file>item_my_

我开发了聊天应用程序,有不同类型的消息:简单的文本,图像,文件等.
也只有消息(其他在屏幕左侧)和我的消息(在屏幕右侧).

现在,每种消息类型都有不同的布局:

> item_message_simple
> item_my_message_simple
> item_message_image
> item_my_message_image
> item_message_file
> item_my_message_file

所有这些类型都在RecyclerVIEw.Adapter中定义,并且getItemVIEwType()中有许多if-else条件

此外,消息可能会被转发和转发,其布局会更加复杂.
如果我想添加新的消息类型,那将是灾难.

那么如何组织更好的方法呢?
也许应该全部采用一种布局,并选择两种类型:MESSAGE,MY_MESSAGE-和显示/隐藏布局的一部分.
或再次输入2种类型(MESSAGE,MY_MESSAGE),然后在VIEwHolder中填充所需的子布局.

请任何帮助!

解决方法:

就我而言,我也具有相同类型的消息选项,并且需要根据发件人消息和已接收消息进行区分.我根据消息类型自行创建了视图持有人,同时为发件人和接收人添加了不同的布局

每个味精具有不同的消息选项(文本,图像,视频,文件,音频等),我在onBindVIEwHolder()中使用开关大小写进行了显示和隐藏显示.

我在一起有三个不同的vIEwHolders.

YOU:您发送的邮件(应始终在屏幕上始终显示)就您的情况而言,MY_MESSAGE

其他:其他人发送的消息(应始终显示在屏幕左侧)

时间轴:时间轴消息,例如用户更改了聊天名称,已删除,因此用户等

所以在这里,

@OverrIDe    public MyVIEwHolder onCreateVIEwHolder(VIEwGroup parent, int vIEwType) {        MyVIEwHolder vIEwHolder = null;        LayoutInflater inflater = LayoutInflater.from(parent.getContext());        switch (vIEwType) {            case YOU:                VIEw v1 = inflater.inflate(R.layout.chat_right_layout, parent, false);                vIEwHolder = new MyVIEwHolder(v1, true);                break;            case OTHERS:                VIEw v2 = inflater.inflate(R.layout.chat_left_layout, parent, false);                vIEwHolder = new MyVIEwHolder(v2, false);                break;            case TIMEliNE:                VIEw v3 = inflater.inflate(R.layout.chat_timeline_layout, parent, false);                vIEwHolder = new MyVIEwHolder(v3, false);                break;        }        return vIEwHolder;    }

在这里,我总共有3个不同的xml文件(您,其他和时间线消息)
每个You布局和其他xml布局都有分别合并Text,Image和pdf的视图.

@OverrIDe    public voID onBindVIEwHolder(final MyVIEwHolder holder, int position) {        ChatModel model = mDataList.get(position);        if (model.getMessageType() == 10) // timeline message {            holder.mTvTimeline.setText(DecodeUtil.decodeBase64(model.getMessageText())+" on "+date);        }else{            showtextAndMediaData(holder, model);        }    }

这是我为处理不同消息类型“个人”(“您和其他人的文本图像”)编写的逻辑.

 private voID showtextAndMediaData(MyVIEwHolder myVIEwHolder, ChatModel model) {        switch (model.getMessageType()) {            case 1:   // Image Type                myVIEwHolder.mTxtMsg.setVisibility(VIEw.GONE);                myVIEwHolder.chatimageVIEw.setVisibility(VIEw.VISIBLE);                myVIEwHolder.vIDeolayout.setVisibility(VIEw.GONE);                myVIEwHolder.documentImageVIEw.setVisibility(VIEw.GONE);                    Uri mInitialUri = Uri.parse(model.getMessageText());                    try {                        myVIEwHolder.chatimageVIEw.setimageURI(mInitialUri);                    } catch (Exception e) {                        e.printstacktrace();                    }                break;            case 3:  // vIDeo type                myVIEwHolder.mTxtMsg.setVisibility(VIEw.GONE);                myVIEwHolder.chatimageVIEw.setVisibility(VIEw.GONE);                myVIEwHolder.vIDeolayout.setVisibility(VIEw.VISIBLE);                myVIEwHolder.documentImageVIEw.setVisibility(VIEw.GONE);                    GlIDe.with(mContext).load(headers.getUrlWithheaders(mContext, model.getthumbnailURL()))                            .placeholder(R.drawable.novIDeo)                            .thumbnail(0.5f)                            .crossFade()                            .diskCacheStrategy(diskCacheStrategy.ALL)                            .into(myVIEwHolder.vedioImageVIEw);                }                 break;            case 4:             case 5:            case 6:            case 7:            case 8:            case 9:   // file type                myVIEwHolder.mTxtMsg.setVisibility(VIEw.GONE);                myVIEwHolder.chatimageVIEw.setVisibility(VIEw.GONE);                myVIEwHolder.vIDeolayout.setVisibility(VIEw.GONE);                myVIEwHolder.documentImageVIEw.setVisibility(VIEw.VISIBLE);                switch (model.getMediaType()) {                    case "doc":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_word_document));                        break;                    case "pdf":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_pdf));                        break;                    case "excel":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_excel));                        break;                    case "ppt":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_ppt));                        break;                    case "txt":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_txt));                        break;                    case "csv":                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_csv));                        break;                    default:                        myVIEwHolder.documentImageVIEw.setimageDrawable(ContextCompat.getDrawable(mContext, R.drawable.img_otherdoc));                }                break;            default:  // text type                myVIEwHolder.mTxtMsg.setVisibility(VIEw.VISIBLE);                myVIEwHolder.chatimageVIEw.setVisibility(VIEw.GONE);                myVIEwHolder.vIDeolayout.setVisibility(VIEw.GONE);                myVIEwHolder.documentImageVIEw.setVisibility(VIEw.GONE);                    try {                        myVIEwHolder.mTxtMsg.setText(text);                    } catch (Exception e) {                        e.printstacktrace();                        myVIEwHolder.mTxtMsg.setText(text);                    }        }    }

删除了一些案例逻辑,因为它们都是不同的类型并以相同的方式处理.我还为发送方和接收方提供了更多逻辑,这些逻辑也在此块中删除.您可以根据需要添加

是的,当您添加新消息类型时,您需要在onBindVIEwHolder中再添加一个案例来添加它,这很困难.

希望它能帮助您完成任务.

总结

以上是内存溢出为你收集整理的android-如何在聊天应用上使用不同类型的消息来组织RecyclerView?全部内容,希望文章能够帮你解决android-如何在聊天应用上使用不同类型的消息来组织RecyclerView?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1210143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存