在recyclerview中使用其item布局的ViewBinding类需要注意的问题
创始人
2025-06-01 14:17:34
0

问题描述

最近在使用RecycerView的瀑布流布局,我想直接用ViewBinding取得item中的一个TextView然后根据position进行赋值。

比如我点击测试标题2,它在日志中应该能打印出测试标题2才对。

在这里插入图片描述

但是他却打印出“测试标题0”

在这里插入图片描述

按理来说标题应该更点击的位置对的上才对。
但是发现瀑布流的布局根本不是按照数据集里的顺序进行排列的,而是出现了数据错乱重复、点击的位置跟标题对不上的情况。

问题原因

我们每个item不是有一个布局吗?我使用了ViewBinding,他会生成一个binding类。
我在RecyclerView的适配器中没有使用ViewHolderitem布局里的控件进行操作,而是直接通过生成的Binding类进行操作:

@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if(getItemViewType(position) == DefaultVals.POST_TYPE_TEXT){mItemTypeTextBinding.userAvatar2.setImageResource(R.drawable.ic_launcher_background);mItemTypeTextBinding.userUnit2.setText(mPostItems.get(position).getUserHouseAddr());mItemTypeTextBinding.postTitle2.setText(mPostItems.get(position).getPostTitle());mItemTypeTextBinding.postContent2.setText(mPostItems.get(position).getPostContent());mItemTypeTextBinding.postTag2.setText(mPostItems.get(position).getPostTag());mItemTypeTextBinding.postDate2.setText(mPostItems.get(position).getPostDate());}

这样会出现有些item是重复的。因为Binding类实例在适配器中只有一个,当我们进行滑动的时候,就会调用onBindViewHolder,而一次onBindViewHolder的调用postion是确定的,里面直接根据position通过binding类来设定布局,这样就会产生很多个相同的item。所以就会出现item重复,继而引发数据错乱,标题对不上位置。

解决

不要在onBindViewHolder中直接通过生成的Binding类来操作控件,老老实实用viewHolderViewBinding类本质是解决满屏都是findViewById的问题,只是让你减少了使用大量重复findViewById的工作量,使用它来操作控件要谨慎再谨慎。

建立自己的viewHolder,通过它对item的控件进行操作。

    class ViewHolderWithContent extends RecyclerView.ViewHolder{public ImageView userAvatar ;public TextView username ;public TextView userUnit ;public TextView postTitle ;public TextView postContent ;public TextView postTag ;public TextView postDate ;public ViewHolderWithContent(@NonNull View itemView) {super(itemView);userAvatar = itemView.findViewById(R.id.user_avatar2);username = itemView.findViewById(R.id.username2);userUnit = itemView.findViewById(R.id.user_unit2);postContent= itemView.findViewById(R.id.post_content2);postTitle = itemView.findViewById(R.id.post_title2);postTag = itemView.findViewById(R.id.post_tag2);postDate = itemView.findViewById(R.id.post_date2);}}

onBindViewHolder中通过自己的ViewHolder进行控件操作:

@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if(getItemViewType(position) == DefaultVals.POST_TYPE_TEXT){((ViewHolderWithContent)holder).userAvatar.setImageResource(R.drawable.ic_launcher_background);((ViewHolderWithContent)holder).username.setText(mPostItems.get(position).getUsername());((ViewHolderWithContent)holder).userUnit.setText(mPostItems.get(position).getUserHouseAddr());((ViewHolderWithContent)holder).postTitle.setText(mPostItems.get(position).getPostTitle());((ViewHolderWithContent)holder).postContent.setText(mPostItems.get(position).getPostContent());((ViewHolderWithContent)holder).postTag.setText(mPostItems.get(position).getPostTag());((ViewHolderWithContent)holder).postDate.setText(mPostItems.get(position).getPostDate());//            mItemTypeTextBinding.userAvatar2.setImageResource(R.drawable.ic_launcher_background);
//            mItemTypeTextBinding.userUnit2.setText(mPostItems.get(position).getUserHouseAddr());
//            mItemTypeTextBinding.postTitle2.setText(mPostItems.get(position).getPostTitle());
//            mItemTypeTextBinding.postContent2.setText(mPostItems.get(position).getPostContent());
//            mItemTypeTextBinding.postTag2.setText(mPostItems.get(position).getPostTag());
//            mItemTypeTextBinding.postDate2.setText(mPostItems.get(position).getPostDate());}

相关内容

热门资讯

VIP机会日报海南自贸区概念爆... 注:财联社VIP为内容资讯产品,并非投资建议。以下内容仅为资讯价值展示非对相关公司的推荐建议,非未来...
涨停复盘:今日全市共80股涨停... 12月22日,A股三大股指高开高走,全天高位震荡,截止收盘,沪指涨0.69%报3917.36点,深成...
国际金价,再创新高! 美国纽约商品交易所黄金期货价格21日再创历史新高。其中,交投最活跃的2026年2月黄金期价盘中突破每...
闻泰董事长发声:荷兰政府违反了... 【文/观察者网 王一】距离荷兰宣布暂停对安世半导体的干预已经过去了一个多月,但至今未采取进一步措施撤...
央行发布一次性信用修复政策 22日,中国人民银行发布通知,实施一次性信用修复政策,支持信用受损但积极还款的个人高效便捷重塑信用。...
复牌!603305,拟易主国资 来源:中国基金报 【导读】旭升集团拟易主广州国资,自12月23日开市起复牌 中国基金报记者 闻言 1...
原创 1... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
智能问数方案哪家更靠谱?企业选... 数据驱动已成为企业竞争的核心壁垒,“非技术人员高效获取数据洞察”却仍是多数企业的数字化痛点。传统BI...
捷达新公司董事长落定,为何是一... 一汽-大众旗下捷达品牌独立运营的公司正式落定四川成都,而法定代表人和董事长人选并非技术研发负责人,而...
旗下产品陷兑付危机,祥源系实控... 祥源系理财产品出现到期无法兑付及无法提现后,12月22日晚,祥源系上市公司交建股份、祥源文旅发布公告...
拉里·埃里森为华纳兄弟并购案提... 财联社12月22日讯(编辑 史正丞)为了护航家族传媒帝国的扩张,年逾8旬的甲骨文创始人拉里·埃里森(...
A股又一行业巨头来了!发行价超... 据目前安排,若无变化本周(12月22日到26日)有3只新股申购。其中上证主板1只,创业板1只,北交所...
赋能实体经济发展丨中盈基金公司... 近日,湘江集团中盈投资旗下中盈基金公司成功入选《中国私募基金年鉴》2025年度优秀私募管理人名单。在...
原创 沃... 百亿疫苗巨头又收监管函!创始人“抽梯”,国资能否“搭台”? 作者 | 于婞 编辑丨高岩 来源 | 野...
利好!中科万福集团股份有限公司... 简讯,中科万福集团股份有限公司(简称:中科万福集团)于2025年12月15日获800万元天使轮融资,...
“十四五”我省管好用好债券资金... “十四五”以来,我省统筹发展与安全,构建“借、用、管、还”全流程闭环政府债务管理体系,规范使用债券资...
明日复牌!603305,拟迎广... 本次权益变动完成后,旭升集团的控股股东将由徐旭东变更为广州工控集团,公司的实际控制人将由徐旭东变更为...
消费者不爱,资本退潮!植物肉在... 作者|红餐网 桂湘 据南方都市报,近日,“植物肉第一股”植别样肉客(Beyond Meat)在天猫...
2026年A股休市安排发布 今天(12月22日),上海证券交易所、深圳证券交易所、北京证券交易所发布通知,明确了2026年A股市...
“甜蜜福利”来啦!车厘子低价上... 长沙晚报掌上长沙12月22日讯(全媒体记者 贾凯清)岁末将至,车厘子作为冬季水果市场的“重头戏”,今...