如何在Retrofit的onResponse中返回列表并构建ListView?
Retrofit异步回调无法获取返回值,构建列表解决方案
我查过不少类似问题,但都没精准解决我的需求。现在用Retrofit拉取数据列表,想把数据存到本地列表后构建ListView,但没法从onResponse里拿到返回值,直接return列表也没用,求帮忙。
原相关代码
回调函数
public ListCatcher allBreeds(View view){ ArrayList<String> breedList = new ArrayList<>(breeds); Ibreeds.allBreeds().enqueue(new Callback<Breeds>() { @Override public void onResponse(Call<Breeds> call, Response<Breeds> response) { List<String> breeds = response.body().getMessage(); for (String b: breeds){ breedList.add(b); } } @Override public void onFailure(Call<Breeds> call, Throwable t) { Snackbar.make(view,R.string.connectionStatus, 3000 ).show(); } }); ListCatcher listcatcher = new ListCatcher(breedList); return listcatcher; }
接口定义
public interface BreedsDAOInterface { @GET("breeds/list") Call<Breeds> allBreeds(); @GET("breed/{breed}/list") Call<Breeds> listSubBreed(@Path("breed") String breed); @GET("breed/{breed}/images") Call<Breeds> listBreedImages(@Path("breed") String breed); @GET("breed/{breed}/{subBreed}/images") Call<Breeds> listSubBreedImages(@Path("breed") String breed, @Path("subBreed") String subBreed); @GET("breeds/image/random") Call<Breeds> iFeelLucky(); }
ApiUtils类
public class ApiUtils { public static final String BASE_URL = "https://dog.ceo/api/"; public static BreedsDAOInterface getBreedsDaoInterface(){ return RetrofitClient.getClient(BASE_URL).create(BreedsDAOInterface.class); } }
RetrofitClient类
public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseURL){ if (retrofit == null){ retrofit = new Retrofit .Builder() .baseUrl(baseURL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }
Breeds实体类
public class Breeds { @SerializedName("message") @Expose private List<String> message; public List<String> getMessage() { return message; } public void setMessage(List<String> message) { this.message = message; } }
已找到的解决方案
删除了ListCatcher,把RecyclerView适配器的初始化逻辑放到enqueue的回调函数里,代码如下:
public class HomeActivity extends AppCompatActivity { List<String> breedsList = new ArrayList<>(); private BreedsInterface Ibreeds; private RecyclerViewAdapter RWAdapter; private ActivityHomeBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityHomeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); Ibreeds = ApiUtils.getBreedsDaoInterface(); allBreeds(); } public void allBreeds(){ Ibreeds.allBreeds().enqueue(new Callback<Answer>() { @Override public void onResponse(Call<Answer> call, Response<Answer> response) { List<String> breedResponceList = response.body().getMessage(); breedsList.clear(); breedsList.addAll(breedResponceList); initRecyclerView(); } @Override public void onFailure(Call<Answer> call, Throwable t) { throwError(); } }); } private void throwError() { Snackbar.make(binding.getRoot(), R.string.connectionStatus, 3000).show(); } private void initRecyclerView() { RWAdapter = new RecyclerViewAdapter(breedsList); binding.recyclerView.setLayoutManager(new LinearLayoutManager(this)); binding.recyclerView.setAdapter(RWAdapter); } }
核心逻辑是把列表适配器的初始化与绑定操作,放到Retrofit异步请求成功的onResponse回调中执行,确保数据返回后再构建列表。
内容的提问来源于stack exchange,提问作者Burak Cem Dursun
相关产品推荐
相关产品推荐

