gson JSON onResponse -列表将不会填充数据

f2uvfpb9  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(174)

我得到了一个工作的应用程序(有点)。它是为了填充屏幕从JSON数据的请求。我以为我有什么到目前为止会工作,但我猜不是。onResponse似乎从来没有被调用,所以数据从来没有被分配到一个变量进行处理,我不知道如何解决这个问题。任何和所有的帮助是非常感谢。
下面是我的相关代码:
我的JSON数据是:

{
   "popular":[
      {
         "name":"Pizza",
         "imageURL":"https://static4.depositphotos.com/1016418/315/i/600/depositphotos_3158962-stock-photo-pepperoni-pizza-isolated.jpg",
         "rating":"4.8",
         "deliveryTime":"45 min",
         "deliveryCharges":"Free Delivery",
         "price":"15",
         "note":"Delicious"
      },
      {
         "name":"Chick-Fil-A",
         "imageURL":"https://media.istockphoto.com/photos/chicken-bacon-club-sandwich-picture-id585602032?k=6&m=585602032&s=612x612&w=0&h=DzlMVMOaqC25Zf78NPGzr9nLOf7wANEgv9u_vScu4d8=",
         "rating":"5.0",
         "deliveryTime":"15 min",
         "deliveryCharges":"3",
         "price":"7",
         "note":"Classic"
      },
      {
         "name":"Mac & Cheese",
         "imageURL":"https://media.istockphoto.com/photos/homemade-baked-creamy-macaroni-and-cheese-picture-id483485720?k=6&m=483485720&s=612x612&w=0&h=u2Wb4hR0cIqNAm8q_4j-oFPrtC4hT_YXaq2srA2zmqI=",
         "rating":"4.7",
         "deliveryTime":"20 min",
         "deliveryCharges":"1",
         "price":"4",
         "note":"Homestyle"
      }
   ],
   "recommended":[
      {
         "name":"Chicken Tikka Masala",
         "imageURL":"https://media.istockphoto.com/photos/chicken-tikka-masala-curry-with-rice-and-naan-bread-picture-id1143530019?k=6&m=1143530019&s=612x612&w=0&h=aOCxTVcwi88NHCX9-xgNu7cmPX9rq5AGtEVYblNTnGc=",
         "rating":"4.8",
         "deliveryTime":"25 min",
         "deliveryCharges":"2",
         "price":"14",
         "note":"Fan Favorite"
      },
      {
         "name":"Strawberry Milkshake",
         "imageURL":"https://thumbs.dreamstime.com/b/strawberry-milkshake-covered-whipped-cream-plastic-glass-isolated-white-background-44432579.jpg",
         "rating":"4.5",
         "deliveryTime":"10 min",
         "deliveryCharges":"0",
         "price":"4",
         "note":"Chilly"
      },
      {
         "name":"3 Tacos",
         "imageURL":"https://previews.123rf.com/images/gdolgikh/gdolgikh1703/gdolgikh170300221/74432760-mexican-tacos-with-beef.jpg",
         "rating":"4.6",
         "deliveryTime":"17 min",
         "deliveryCharges":"1",
         "price":"12",
         "note":"Hard or Soft Shell"
      }
   ],
   "allmenu":[
      {
         "name":"Pizza",
         "imageURL":"https://static4.depositphotos.com/1016418/315/i/600/depositphotos_3158962-stock-photo-pepperoni-pizza-isolated.jpg",
         "rating":"4.8",
         "deliveryTime":"45 min",
         "deliveryCharges":"Free Delivery",
         "price":"15",
         "note":"Delicious"
      },
      {
         "name":"Chick-Fil-A",
         "imageURL":"https://media.istockphoto.com/photos/chicken-bacon-club-sandwich-picture-id585602032?k=6&m=585602032&s=612x612&w=0&h=DzlMVMOaqC25Zf78NPGzr9nLOf7wANEgv9u_vScu4d8=",
         "rating":"5.0",
         "deliveryTime":"15 min",
         "deliveryCharges":"3",
         "price":"7",
         "note":"Classic"
      },
      {
         "name":"Mac & Cheese",
         "imageURL":"https://media.istockphoto.com/photos/homemade-baked-creamy-macaroni-and-cheese-picture-id483485720?k=6&m=483485720&s=612x612&w=0&h=u2Wb4hR0cIqNAm8q_4j-oFPrtC4hT_YXaq2srA2zmqI=",
         "rating":"4.7",
         "deliveryTime":"20 min",
         "deliveryCharges":"1",
         "price":"4",
         "note":"Homestyle"
      },
      {
         "name":"Chicken Tikka Masala",
         "imageURL":"https://media.istockphoto.com/photos/chicken-tikka-masala-curry-with-rice-and-naan-bread-picture-id1143530019?k=6&m=1143530019&s=612x612&w=0&h=aOCxTVcwi88NHCX9-xgNu7cmPX9rq5AGtEVYblNTnGc=",
         "rating":"4.8",
         "deliveryTime":"25 min",
         "deliveryCharges":"2",
         "price":"14",
         "note":"Fan Favorite"
      },
      {
         "name":"Strawberry Milkshake",
         "imageURL":"https://thumbs.dreamstime.com/b/strawberry-milkshake-covered-whipped-cream-plastic-glass-isolated-white-background-44432579.jpg",
         "rating":"4.5",
         "deliveryTime":"10 min",
         "deliveryCharges":"0",
         "price":"4",
         "note":"Chilly"
      },
      {
         "name":"3 Tacos",
         "imageURL":"https://previews.123rf.com/images/gdolgikh/gdolgikh1703/gdolgikh170300221/74432760-mexican-tacos-with-beef.jpg",
         "rating":"4.6",
         "deliveryTime":"17 min",
         "deliveryCharges":"1",
         "price":"12",
         "note":"Hard or Soft Shell"
      }
   ]
}

我有适用于AllmenuFoodDataPopularRecommended的模型。
所有菜单:

package com.example.bearcateats.model;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class Allmenu {

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("imageURL")
    @Expose
    private String imageURL;
    @SerializedName("rating")
    @Expose
    private String rating;
    @SerializedName("deliveryTime")
    @Expose
    private String deliveryTime;
    @SerializedName("deliveryCharges")
    @Expose
    private String deliveryCharges;
    @SerializedName("price")
    @Expose
    private String price;
    @SerializedName("note")
    @Expose
    private String note;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    public String getRating() {
        return rating;
    }

    public void setRating(String rating) {
        this.rating = rating;
    }

    public String getDeliveryTime() {
        return deliveryTime;
    }

    public void setDeliveryTime(String deliveryTime) {
        this.deliveryTime = deliveryTime;
    }

    public String getDeliveryCharges() {
        return deliveryCharges;
    }

    public void setDeliveryCharges(String deliveryCharges) {
        this.deliveryCharges = deliveryCharges;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

}

食品数据:

package com.example.bearcateats.model;

import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class FoodData {

    @SerializedName("popular")
    @Expose
    private List<Popular> popular = null;
    @SerializedName("recommended")
    @Expose
    private List<Recommended> recommended = null;
    @SerializedName("allmenu")
    @Expose
    private List<Allmenu> allmenu = null;

    public List<Popular> getPopular() {
        return popular;
    }

    public void setPopular(List<Popular> popular) {
        this.popular = popular;
    }

    public List<Recommended> getRecommended() {
        return recommended;
    }

    public void setRecommended(List<Recommended> recommended) {
        this.recommended = recommended;
    }

    public List<Allmenu> getAllmenu() {
        return allmenu;
    }

    public void setAllmenu(List<Allmenu> allmenu) {
        this.allmenu = allmenu;
    }

}

人气:

package com.example.bearcateats.model;

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class Popular {

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("imageURL")
    @Expose
    private String imageURL;
    @SerializedName("rating")
    @Expose
    private String rating;
    @SerializedName("deliveryTime")
    @Expose
    private String deliveryTime;
    @SerializedName("deliveryCharges")
    @Expose
    private String deliveryCharges;
    @SerializedName("price")
    @Expose
    private String price;
    @SerializedName("note")
    @Expose
    private String note;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    public String getRating() {
        return rating;
    }

    public void setRating(String rating) {
        this.rating = rating;
    }

    public String getDeliveryTime() {
        return deliveryTime;
    }

    public void setDeliveryTime(String deliveryTime) {
        this.deliveryTime = deliveryTime;
    }

    public String getDeliveryCharges() {
        return deliveryCharges;
    }

    public void setDeliveryCharges(String deliveryCharges) {
        this.deliveryCharges = deliveryCharges;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

}

建议:

package com.example.bearcateats.model;

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("jsonschema2pojo")
public class Recommended {

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("imageURL")
    @Expose
    private String imageURL;
    @SerializedName("rating")
    @Expose
    private String rating;
    @SerializedName("deliveryTime")
    @Expose
    private String deliveryTime;
    @SerializedName("deliveryCharges")
    @Expose
    private String deliveryCharges;
    @SerializedName("price")
    @Expose
    private String price;
    @SerializedName("note")
    @Expose
    private String note;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    public String getRating() {
        return rating;
    }

    public void setRating(String rating) {
        this.rating = rating;
    }

    public String getDeliveryTime() {
        return deliveryTime;
    }

    public void setDeliveryTime(String deliveryTime) {
        this.deliveryTime = deliveryTime;
    }

    public String getDeliveryCharges() {
        return deliveryCharges;
    }

    public void setDeliveryCharges(String deliveryCharges) {
        this.deliveryCharges = deliveryCharges;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

}

主要:

package com.example.bearcateats;

import android.os.Bundle;
import android.widget.Toast;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.bearcateats.adapters.PopularAdapter;
import com.example.bearcateats.adapters.RecommendedAdapter;
import com.example.bearcateats.model.Allmenu;
import com.example.bearcateats.model.FoodData;
import com.example.bearcateats.model.Popular;
import com.example.bearcateats.model.Recommended;
import com.example.bearcateats.retrofit.ApiInterface;
import com.example.bearcateats.retrofit.RetrofitClient;
import com.example.bearcateats.adapters.AllMenuAdapter;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    ApiInterface apiInterface;

    RecyclerView popularRecyclerView, recommendedRecyclerView, allMenuRecyclerView;

    PopularAdapter popularAdapter;
    RecommendedAdapter recommendedAdapter;
    AllMenuAdapter allMenuAdapter;

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

        apiInterface = RetrofitClient.getRetrofitInstance().create(ApiInterface.class);

        Call<List<FoodData>> call = apiInterface.getAllData();
        call.enqueue(new Callback<List<FoodData>>() {
            @Override
            public void onResponse(Call<List<FoodData>> call, Response<List<FoodData>> response) {
                System.out.println("TEST!!!!!!!!!!!!!!");
                List<FoodData> MenuList;
                MenuList = response.body();
                if(MenuList == null) {
                    System.out.println("MenuList!!!!!!!!!!!!!!");
                }

                List <FoodData> test1 = (List<FoodData>) MenuList.get(0);

                List<Popular> popular = ((FoodData) test1).getPopular();

                getPopularData(popular);
                System.out.println("GET POPULAR RAN!!!!!!!!!!!!!!");

                getRecommendedData(MenuList.get(0).getRecommended());
            }

            @Override
            public void onFailure(Call<List<FoodData>> call, Throwable t) {
                Toast.makeText(MainActivity.this, "Server is not responding.", Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void  getPopularData(List<Popular> popularList){

        popularRecyclerView = findViewById(R.id.popular_recycler);
        popularAdapter = new PopularAdapter(this, popularList);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        popularRecyclerView.setLayoutManager(layoutManager);
        popularRecyclerView.setAdapter(popularAdapter);

    }

    private void  getRecommendedData(List<Recommended> recommendedList){

        recommendedRecyclerView = findViewById(R.id.recommended_recycler);
        recommendedAdapter = new RecommendedAdapter(this, recommendedList);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recommendedRecyclerView.setLayoutManager(layoutManager);
        recommendedRecyclerView.setAdapter(recommendedAdapter);

    }

    private void  getAllMenu(List<Allmenu> allmenuList){

        allMenuRecyclerView = findViewById(R.id.all_menu_recycler);
        allMenuAdapter = new AllMenuAdapter(this, allmenuList);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        allMenuRecyclerView.setLayoutManager(layoutManager);
        allMenuRecyclerView.setAdapter(allMenuAdapter);
        allMenuAdapter.notifyDataSetChanged();

    }
}

食物详情

{

    // now we will get data from intent and set to UI

    ImageView imageView;
    TextView itemName, itemPrice, itemRating;
    RatingBar ratingBar;

    String name, price, rating, imageUrl;

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

        Intent intent = getIntent();

        name = intent.getStringExtra("name");
        price = intent.getStringExtra("price");
        rating = intent.getStringExtra("rating");
        imageUrl = intent.getStringExtra("image");

        imageView = findViewById(R.id.imageView5);
        itemName = findViewById(R.id.name);
        itemPrice = findViewById(R.id.price);
        itemRating = findViewById(R.id.rating);
        ratingBar = findViewById(R.id.ratingBar);

        Glide.with(getApplicationContext()).load(imageUrl).into(imageView);
        itemName.setText(name);
        itemPrice.setText("$ "+price);
        itemRating.setText(rating);
        ratingBar.setRating(Float.parseFloat(rating));

    }
}
ef1yzkbh

ef1yzkbh1#

有几个愚蠢的错误。我已经修复了你所有的错误。你的JSONResponse数据类没有任何错误。正确的responseonResponse()回调中被接收。问题存在于你代码的其他部分。只要一步一步地遵循。

步骤-1

在解析api调用中的response数据时,替换以下代码,如下所示:

call.enqueue(new Callback<List<FoodData>>() {
        @Override
        public void onResponse(Call<List<FoodData>> call, Response<List<FoodData>> response) {
            if (response.isSuccessful()){
                if (response.body() != null){
                    List<Popular> popular = response.body().get(0).getPopular();

                    getPopularData(popular);

                    getRecommendedData(response.body().get(0).getRecommended());
                }
            }
        }

        @Override
        public void onFailure(Call<List<FoodData>> call, Throwable t) {
            Toast.makeText(MainActivity.this, "Server is not responding.", Toast.LENGTH_SHORT).show();
        }
    });

步骤2

PopularAdapter类中替换getItemCount()方法,如下所示:

@Override
public int getItemCount() {
    //return 0;   // Returning 0 will show nothing in RecyclerView.
   return popularList.size();
}

步骤3:

RecommendedAdapter类中,您将错误的xml用于ViewHolder。请按如下所示进行替换:

@NonNull
@Override
public RecommendedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //View view = LayoutInflater.from(context).inflate(R.layout.popular_recycler_items, parent, false);
    View view = LayoutInflater.from(context).inflate(R.layout.recommended_recyvler_items, parent, false);
    return new RecommendedViewHolder(view);
}

并且也像下面这样替换getItemCount()的方法:

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

更新日期:-

为什么在api调用的onSuccess()内调用相同的api?我已经更新了您的onCreate()方法,如下所示:

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

    apiInterface = RetrofitClient.getRetrofitInstance().create(ApiInterface.class);

    Call<List<FoodData>> call = apiInterface.getAllData();
    call.enqueue(new Callback<List<FoodData>>() {
        @Override
        public void onResponse(Call<List<FoodData>> call, Response<List<FoodData>> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    getPopularData(response.body().get(0).getPopular());
                    getRecommendedData(response.body().get(0).getRecommended());
                    getAllMenu(response.body().get(0).getAllmenu());
                }
            }
        /*              
     call.clone().enqueue(new Callback<List<FoodData>>() {
                @Override
                public void onResponse(Call<List<FoodData>> call, Response<List<FoodData>> response) {
                    if (response.isSuccessful()) {
                        if (response.body() != null) {
                            response.code();
                            getPopularData(response.body().get(0).getPopular());
                            getRecommendedData(response.body().get(0).getRecommended());
                            getAllMenu(response.body().get(0).getAllmenu());
                        }
                    }
                }

                @Override
                public void onFailure(Call<List<FoodData>> call, Throwable t) {
                    response.code();
                    Toast.makeText(MainActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                }
            });*/
        }

        @Override
        public void onFailure(Call<List<FoodData>> call, Throwable t) {
            Toast.makeText(MainActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}
ix0qys7i

ix0qys7i2#

我看到https://francescainfranca.github.io/menuJSON/index.json中的JSON是单个FoodData JSON对象,而不是JSON数组。
这会在运行应用程序时导致以下异常。因此,请更改JSON结构或使应用程序直接使用FoodData,而不是List .

此外,吐司消息(服务器没有响应)也显示在您已添加“失败响应”的运行上。
希望这对你有帮助谢谢。

相关问题