当前位置: 首页 > 知识库问答 >
问题:

适配器不显示来自API响应的数据

彭令秋
2023-03-14

我有一个列表中保存的改造响应。我试图将适配器连接到回收器视图,以显示响应中的数据。我设法将适配器连接到回收器视图,但实际上我看不到任何显示在回收器视图中的数据。响应很好,我可以毫不费力地记录它。

适配器

   public class ForecastAdapter extends RecyclerView.Adapter<ForecastAdapter.ViewHolder> {
    private List<ModelClass> mForecastData = new ArrayList<>();
    private Context mContext;
    private static final String TAG = "ForecastAdapter";

    public ForecastAdapter(Context context, List<ModelClass> mForecastData) {
        this.mContext = context;
        this.mForecastData = mForecastData;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);

        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mTemperature.setText(mForecastData.get(position).getForecastData().get(position)
        .getDatetime());
    }

    @Override
    public int getItemCount() {
        return mForecastData.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView mTemperature, mPressure;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mTemperature = (TextView) itemView.findViewById(R.id.list_temperature);
            mPressure = (TextView) itemView.findViewById(R.id.list_pressure);
        }
    }
}

主要活动

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        List<ModelClass> mForecastData = new ArrayList<>();
        setupRecyclerView(mForecastData);

        Retrofit mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiInterface mInterface = mRetrofit.create(ApiInterface.class);

        Call<ModelClass> mForecastDataCall = mInterface.getForecastData(
                35, 139, "");

        mForecastDataCall.enqueue(new Callback<ModelClass>() {
            @Override
            public void onResponse(Call<ModelClass> call, Response<ModelClass> response) {
                if (!response.isSuccessful()) {
                    System.out.println(response.code());
                }
                mForecastData.addAll(Collections.singleton(response.body()));
            }
            @Override
            public void onFailure(Call<ModelClass> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

    private void setupRecyclerView(List<ModelClass> data){
        RecyclerView mRecyclerView = findViewById(R.id.main_rv);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        mRecyclerView.hasFixedSize();
        ForecastAdapter mAdapter = new ForecastAdapter(getApplicationContext(), data);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
    }
}

模型

    public class ModelClass {
    @SerializedName("cod")
    private int requestCode;
    @SerializedName("list")
    List<ForecastList> forecastData = new ArrayList<>();

    public List<ForecastList> getForecastData() {
        return forecastData;
    }


    public class ForecastList {
        @SerializedName("dt")
        private int datetime;
        @SerializedName("main")
        MainData mainData = null;

        public MainData getMainData() {
            return mainData;
        }

        public int getDatetime() {
            return datetime;
        }

        public class MainData {
            @SerializedName("temp")
            private double temperature;

            public double getTemperature() {
                return temperature;
            }
        }
    }
}

Api响应

       {
  "cod": "200",
  "message": 0,
  "cnt": 40,
  "list": [
    {
      "dt": 1596564000,
      "main": {
        "temp": 293.55,
        "feels_like": 293.13,
        "temp_min": 293.55,
        "temp_max": 294.05,
        "pressure": 1013,
        "sea_level": 1013,
        "grnd_level": 976,
        "humidity": 84,
        "temp_kf": -0.5
      }
    ...

共有1个答案

呼延承平
2023-03-14

我想你是在调用setupRecyclerView(mForecastData) 在接收数据之前填充列表。

在收到如下数据后,尝试调用函数:

    mForecastDataCall.enqueue(new Callback<ModelClass>() {
        @Override
        public void onResponse(Call<ModelClass> call, Response<ModelClass> response) {
            if (!response.isSuccessful()) {
                System.out.println(response.code());
            }
            mForecastData.addAll(Collections.singleton(response.body()));
////////////////////call it here/////////////////            
             setupRecyclerView(mForecastData);
}

        @Override
        public void onFailure(Call<ModelClass> call, Throwable t) {
            t.printStackTrace();
        }

 类似资料:
  • 我正在尝试从Firebase实时数据库中检索数据(产品图像和价格)并将其放入回收器视图中,但我有一些困难。在我的数据库中,我存储了一个产品的图像url,我想在放置在cardView中的ImageView组件中显示该图像。我还设法正确检索了url和价格,但我的回收器视图没有显示它们。这是我的产品类: 我的适配器如下: 我在我的recyclerView中放置的活动: 产品名称是正确的,因为它是一个变量

  • 我想在网站中使用Php获取Api响应(在nodejs中创建),所以为此我使用了curl,但它不起作用,我尝试了以下代码,但不起作用(显示空白页面),我错在哪里?这是我的密码

  • 我不确定,如果我遗漏了什么,但在谷歌上也找不到。我正在研究Jmeter的一些特性。我也用过邮递员。我们有API POST请求,它返回JSON响应。 在从Postman访问API时,我得到了“JSON”响应。(即无问题)和API触发我的服务。 现在,如果从Jmeter命中。如果200和我的服务也触发,则响应。但作为回应,我得到了一些代码或键,而不是JSON值。 就像'e5e9e97a9ba2144b

  • 我正在制作一个音乐播放器应用程序,其中我正在使用一个加载器将歌曲数据加载到适配器,该适配器将使用一个RecyclerView显示。然而,我得到了一个奇怪的错误,我的适配器方法不能工作。只调用适配器的构造函数方法。我还得到了“没有连接适配器;跳过布局”,尽管在stack Overflow中浏览了所有可用的解决方案。 需要注意的几点: 我已经尝试了recyclerview中“未附加适配器;跳过布局”(

  • 我是JMeter的新手。我已经设置了HTTP请求采样器来发送GET请求到Google.com。我得到的反应是200。但我找不到响应头,它显示了响应中的cookie。我想在下一个请求中使用该cookie值。