切换TabLayout标签返回ChatFragment时RecyclerView条目翻倍求解决方案
根本原因
你当前的ChatFragment中,存储列表数据的list是类成员变量,Fragment实例在切换页面时不会被销毁,只会销毁视图层。每次切回ChatFragment触发onCreateView回调时,都会调用getChatList()方法向同一个list中追加数据,不会清空旧数据,同时重复绑定新Adapter,最终导致条目数量累加翻倍。
可行解决方案
方案1:加载数据前先清空原有列表
在getChatList()方法最开头加入列表清空逻辑,避免重复累加数据:private void getChatList() { // 先清空原有数据,防止累加 list.clear(); list.add(new ChatListModel("11","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("12","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("13","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("14","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("15","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); // 第一次初始化后不需要重复创建Adapter if(rv.getAdapter() == null) { rv.setAdapter(new ChatListAdapter(list,getContext())); } else { rv.getAdapter().notifyDataSetChanged(); } }方案2:优化Adapter复用逻辑(推荐)
将Adapter设置为Fragment的成员变量,全局只初始化一次,后续数据变更仅刷新列表,避免重复创建Adapter带来的性能损耗:public class ChatsFragment extends Fragment { public ChatsFragment() {} private List<ChatListModel> list = new ArrayList<>(); private RecyclerView rv; // 新增Adapter成员变量 private ChatListAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_chats, container, false); rv = v.findViewById(R.id.recycler_view); rv.setLayoutManager(new LinearLayoutManager(getContext())); // 全局只初始化一次Adapter if(adapter == null) { adapter = new ChatListAdapter(list, getContext()); rv.setAdapter(adapter); } getChatList(); return v; } private void getChatList() { list.clear(); // 此处添加模拟数据逻辑不变 list.add(new ChatListModel("11","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("12","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("13","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("14","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); list.add(new ChatListModel("15","Devesh","good bye","15/10/2020","https://i.pinimg.com/550x/7d/1a/3f/7d1a3f77eee9f34782c6f88e97a6c888.jpg")); // 数据更新后通知Adapter刷新即可 adapter.notifyDataSetChanged(); } }方案3:可选适配ViewPager场景
如果你是通过ViewPager/ViewPager2加载Fragment,可以设置页面缓存数量,避免Fragment视图重复销毁重建,减少不必要的onCreateView回调:// ViewPager2 示例,参数根据你的总页面数调整,保证ChatFragment在缓存范围内 viewPager2.setOffscreenPageLimit(2);
内容的提问来源于stack exchange,提问作者Devesh Parmar
相关产品推荐
相关产品推荐

