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.