You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:54:08