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

如何从Retrofit2服务器响应提取数据到RecyclerView Adapter

解决Retrofit2解析后提取"results"列表到RecyclerView的问题

看起来你已经走完了POJO定义和Retrofit调用的大部分流程,卡在了把results数据传递给RecyclerView Adapter这一步。核心问题是数据源类型不匹配和Adapter作用域限制,我帮你一步步修正:

1. 修正数据源的类型匹配问题

你的POJO里,UserModelDto是整个响应的根对象,包含count、next和真正的课程列表results(类型为List<UserModelDto.Result>)。但你当前的mUserModelDtoList定义为List<UserModelDto>,和results的类型完全不匹配,这是addAll失败的主要原因。

修改Fragment的成员变量:

public class SearchResultOfCourses extends Fragment {
    // 修正为Result类型的列表,对应响应中的results数据
    private List<UserModelDto.Result> mCourseResultsList;
    private RecyclerView mRecyclerView;
    // 把Adapter改为成员变量,方便在Retrofit回调中访问
    private DataAdapter mDataAdapter;

    // ... 其他代码保持不变
}

2. 调整Adapter的初始化逻辑

在onCreateView中,用修正后的数据源初始化Adapter:

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View qView = inflater.inflate(R.layout.search_result_of_courses, container, false);
    mRecyclerView = qView.findViewById(R.id.list);
    mCourseResultsList = new ArrayList<>();
    // 让Adapter接收Result类型的列表
    mDataAdapter = new DataAdapter(getContext(), mCourseResultsList);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setAdapter(mDataAdapter);
    return qView;
}

3. 在Retrofit回调中正确提取并更新数据

在onResponse里,先做非空判断,再通过getResults()拿到课程列表,添加到数据源后通知Adapter刷新UI:

@Override
public void onResponse(Call<UserModelDto> call, Response<UserModelDto> response) {
    if (response.isSuccessful() && response.body() != null) {
        List<UserModelDto.Result> newResults = response.body().getResults();
        // 避免空列表或null导致的异常
        if (newResults != null && !newResults.isEmpty()) {
            // 清空原有数据(可选,根据需求决定是否保留旧数据)
            mCourseResultsList.clear();
            // 添加新获取的results数据
            mCourseResultsList.addAll(newResults);
            // 通知Adapter数据更新,触发RecyclerView刷新
            mDataAdapter.notifyDataSetChanged();
        }
    }
}

重要提醒:POJO内部类必须为static

你已经在POJO中把Result、PriceDetail等内部类设置为static,这一步非常关键!如果内部类不是static,JSON解析库(比如Gson)无法正确实例化这些嵌套对象,会导致results列表解析为空,一定要保持这个设置。

内容的提问来源于stack exchange,提问作者Alexandr Filippovv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:21:29