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

使用Retrofit 2实现Spinner时数据获取失败,附代码求助

Troubleshooting Retrofit 2 Spinner Data Loading Issues

Hey there! Let's walk through the common reasons your Spinner isn't fetching data with Retrofit 2 and fix them one by one:

1. Missing Error Handling (Critical for Debugging)

Your current code doesn't implement the onFailure callback—this means you won't know if the Retrofit request failed silently. Add this to catch network errors, invalid URLs, or server issues:

@Override
public void onFailure(Call<DataModel> call, Throwable t) {
    loading.dismiss();
    Log.e("RetrofitError", "Request failed: " + t.getMessage());
    // Show a toast or error message to the user for clarity
}

2. Incomplete Data Mapping to Spinner List

Your code cuts off at List<String> listSpinner = new ...—you need to populate this list with values from dataMeridian first. For example, if your Meridian class has a getName() method to retrieve the display text:

List<String> listSpinner = new ArrayList<>();
for (Meridian meridian : dataMeridian) {
    listSpinner.add(meridian.getName()); // Replace with your actual field name
}

3. Missing Spinner Adapter Setup

Even if you have the populated list, you need to create an Adapter and attach it to your Spinner. First, make sure you've referenced the Spinner from your layout:

// Get Spinner instance (replace with your actual Spinner ID from XML)
Spinner spinnerMeridian = findViewById(R.id.spinner_meridian);

// Create and set the Adapter
ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, 
    android.R.layout.simple_spinner_item, listSpinner);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerMeridian.setAdapter(adapter);

4. Verify Data Model & JSON Parsing

Double-check that your DataModel and Meridian classes correctly map to the JSON response from your API. Use @SerializedName annotations if the JSON keys don't match your field names:

public class DataModel {
    @SerializedName("meridian_data") // Match the exact key from your API's JSON response
    private List<Meridian> meridian;

    public List<Meridian> getMeridian() {
        return meridian;
    }
}

public class Meridian {
    @SerializedName("meridian_name")
    private String name;

    public String getName() {
        return name;
    }
}

5. Ensure Response Body Isn't Null

Even if response.isSuccessful() returns true, the response body could still be null. Add a check to avoid crashes and debug missing data:

if (response.isSuccessful()) {
    loading.dismiss();
    DataModel dataModel = response.body();
    if (dataModel != null && dataModel.getMeridian() != null) {
        List<Meridian> dataMeridian = dataModel.getMeridian();
        // Proceed to populate listSpinner and set Adapter
    } else {
        Log.w("RetrofitWarning", "Response body or meridian list is null");
    }
}

Corrected Full Code Example

Putting all these fixes together, your initSpinnerMeridian() method should look like this:

private void initSpinnerMeridian(){ 
    loading = ProgressDialog.show(mContext, null, "Loading...", true, false); 
    mApiInterface.getMeridian().enqueue(new Callback<DataModel>() { 
        @Override 
        public void onResponse(Call<DataModel> call, Response<DataModel> response) { 
            if (response.isSuccessful()) { 
                loading.dismiss(); 
                DataModel dataModel = response.body();
                if (dataModel != null && dataModel.getMeridian() != null) {
                    List<Meridian> dataMeridian = dataModel.getMeridian();
                    List<String> listSpinner = new ArrayList<>();
                    for (Meridian meridian : dataMeridian) {
                        listSpinner.add(meridian.getName()); // Adjust to your actual field
                    }
                    // Setup Spinner Adapter
                    Spinner spinnerMeridian = findViewById(R.id.spinner_meridian);
                    ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, 
                        android.R.layout.simple_spinner_item, listSpinner);
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinnerMeridian.setAdapter(adapter);
                } else {
                    Log.w("DataWarning", "No valid data received from API");
                }
            } else {
                loading.dismiss();
                Log.e("ResponseError", "Request successful but unexpected code: " + response.code());
            }
        } 

        @Override
        public void onFailure(Call<DataModel> call, Throwable t) {
            loading.dismiss();
            Log.e("RetrofitFailure", "Failed to fetch data: " + t.getMessage());
        }
    }); 
}

Start by adding the onFailure callback to check for network/API issues, then verify your data models and Adapter setup. That should get your Spinner loading data properly!

内容的提问来源于stack exchange,提问作者Belsazer Razer B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:34