我开发了聊天应用程序,有不同类型的消息:简单的文本,图像,文件等.
也只有消息(其他在屏幕左侧)和我的消息(在屏幕右侧).
现在,每种消息类型都有不同的布局:
> 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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)