简体   繁体   中英

Server Data is not fetching in Retrofit

I want to fetch some data from the server by using the retrofit library on RecyclerView but the data is not showing on RecycleView. I read lots of answers but did not solve it yet so please solve my problem thank you in advance.

Below is my JSON Data

{
"item": [
    {
        "Item_Id": "1",
        "Item_Name": "Item Name 1",
        "Item_Description": "Item Name 1 Description",
        "Item_Price": "330.00",
        "Discount": "10",
        "Item_Image": "http://192.168.1.5/easyshop/Items_Image/xyz.jpg",
        "First_Name": "abc",
        "Last_Name": "xyz",
        "Mobile": "**********"
    },
    {
        "Item_Id": "2",
        "Item_Name": "Item Name 2",
        "Item_Description": "Item Name 2 Description",
        "Item_Price": "40.00",
        "Discount": "30",
        "Item_Image": "http://192.168.1.5/easyshop/Items_Image/xyz1.jpg",
        "First_Name": "def",
        "Last_Name": "uvw",
        "Mobile": "**********"
    }
  ]
 }

API Client class where I have used the base URL, GSON and retrofit object

 public class ApiClient {

public static final String BASE_URL = "http://192.168.1.5/easyshop/";
private static Retrofit retrofit = null;

public static Retrofit getClient() {

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(100, TimeUnit.SECONDS)
            .readTimeout(100,TimeUnit.SECONDS)
            .build();

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    return retrofit;
  }
}

Interface

 public interface APIService {
 @FormUrlEncoded
 @POST("GetItem.php")
 Call<ItemArray> getItem(@Field("Retailer_Id")int Retailer_Id);
}

When I put JSON data in www.jsonschema2pojo.org it generates two files which are following as below

public class ItemArray {
  @SerializedName("item")
  @Expose
  private List<ItemList> item = null;

  public List<ItemList> getItem() {
      return item;
  }

 public void setItem(List<ItemList> item) {
      this.item = item;
   }
 }

getter Setter Class

 public class ItemList {
@SerializedName("Item_Id")
@Expose
private String itemId;
@SerializedName("Item_Name")
@Expose
private String itemName;
@SerializedName("Item_Description")
@Expose
private String itemDescription;
@SerializedName("Item_Price")
@Expose
private String itemPrice;
@SerializedName("Discount")
@Expose
private String discount;
@SerializedName("Item_Image")
@Expose
private String itemImage;
@SerializedName("First_Name")
@Expose
private String firstName;
@SerializedName("Last_Name")
@Expose
private String lastName;
@SerializedName("Mobile")
@Expose
private String mobile;

public String getItemId() {
    return itemId;
}

public void setItemId(String itemId) {
    this.itemId = itemId;
}

public String getItemName() {
    return itemName;
}

public void setItemName(String itemName) {
    this.itemName = itemName;
}

public String getItemDescription() {
    return itemDescription;
}

public void setItemDescription(String itemDescription) { this.itemDescription = itemDescription; }

public String getItemPrice() {
    return itemPrice;
}

public void setItemPrice(String itemPrice) {
    this.itemPrice = itemPrice;
}

public String getDiscount() {
    return discount;
}

public void setDiscount(String discount) {
    this.discount = discount;
}

public String getItemImage() {
    return itemImage;
}

public void setItemImage(String itemImage) {
    this.itemImage = itemImage;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getMobile() {
    return mobile;
}

public void setMobile(String mobile) {
    this.mobile = mobile;
  }
}

Adapter Class

public class Item_Card_Adapter  extends RecyclerView.Adapter<Item_Card_Adapter.ViewHolder> {

//List to store all items
List<ItemList> items;

//Constructor of this class
public Item_Card_Adapter(List<ItemList> items){
    super();
    //Getting all items
    this.items = items;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_layout,parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(Item_Card_Adapter.ViewHolder holder, int position) {
    holder.itemName.setText(items.get(position).getItemName());
    holder.itemDesc.setText(items.get(position).getItemDescription());
    holder.itemPrice.setText(items.get(position).getItemPrice());
}

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

class ViewHolder extends RecyclerView.ViewHolder {
    @Bind(R.id.ItemName) TextView itemName;
    @Bind(R.id.ItemDesc) TextView itemDesc;
    @Bind(R.id.ItemPrice) TextView itemPrice;
    @Bind(R.id.cardView) CardView cardView;

    //Initializing Views
    public ViewHolder(final View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
  }
}

Item_Get_Activity Activity class

 public class Item_Get_Activity extends AppCompatActivity {
@Bind(R.id.recyclerrView) RecyclerView recyclerView;
@Bind(R.id.progressBar) ProgressBar progressBar;
private List<ItemList> data;
private Item_Card_Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.item_get_activity);
    ButterKnife.bind(this);
    initViews();
}

private void initViews() {
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(layoutManager);
    getDataFromServer();
}

public void  getDataFromServer() {
    int i = 1;
    APIService service = ApiClient.getClient().create(APIService.class);

    Call<ItemArray> userCall = service.getItem(i);

    userCall.enqueue(new Callback<ItemArray>() {
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        public void onResponse(Call<ItemArray> call, Response<ItemArray> response) {
            if(response.isSuccessful()){
                progressBar.setVisibility(View.GONE);
                data = response.body().getItem();
                adapter = new Item_Card_Adapter(data);
                recyclerView.setAdapter(adapter);
            }
        }

        @Override
        public void onFailure(Call<ItemArray> call, Throwable t) {
            Log.d("onFailure", t.toString());
        }
    });
   }
  }

You need to change your ApiServices Interface like this

public interface APIService {
    @FormUrlEncoded
    @POST("GetItem.php")
    Call<ItemArray> getItem(@Field("Retailer_Id")int Retailer_Id);
}

Then in your Activity update the calling method

public void  getDataFromServer() {
int i = 1;
APIService service = ApiClient.getClient().create(APIService.class);

Call<ItemArray> userCall = service.getItem(i);

userCall.enqueue(new Callback<ItemArray>() {
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onResponse(Call<ItemArray> call, Response<ItemArray> response) {
        if(response.isSuccessful()){
            progressBar.setVisibility(View.GONE);
            data = response.body().getItem();
            adapter = new Item_Card_Adapter(data);
            recyclerView.setAdapter(adapter);
        }
    }

    @Override
    public void onFailure(Call<List<ItemList>> call, Throwable t) {
        Log.d("onFailure", t.toString());
    }
});
}

Since your api response contain the "list" inside a Json object. You need a class that has a List variable. So retrofit will parse the response to ItemArray successfully

Update The demo code link https://github.com/Siddharth-Dev/RetrofitDemo
This has your code and a working API code too.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM