如何从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
相关产品推荐
相关产品推荐

