Данные сервера не загружаются в Retrofit - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу получить некоторые данные с сервера с помощью библиотеки retrofit на RecyclerView, но данные не отображаются в RecycleView. Я прочитал много ответов, но пока не решил, поэтому, пожалуйста, решите мою проблему заранее.

Ниже приведены мои данные JSON

{
"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, в котором я использовал базовый URL, GSON и модифицированный объект

 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;
  }
}

Интерфейс

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

Когда я помещаю данные JSON в www.jsonschema2pojo.org, он генерирует два файла, которые выглядят следующим образом

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;
   }
 }

Класс получения геттера

 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;
  }
}

Адаптер класса

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 Класс активности

 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());
        }
    });
   }
  }

1 Ответ

0 голосов
/ 17 сентября 2018

Вам необходимо изменить свой интерфейс ApiServices следующим образом

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

Затем в своей активности обновите метод вызова

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());
    }
});
}

Так как ваш ответ API содержит «список» внутри объекта Json. Вам нужен класс, который имеет переменную List. Таким образом, модификация будет анализировать ответ на ItemArray успешно

Обновление Ссылка демо-кода https://github.com/Siddharth-Dev/RetrofitDemo
Здесь есть ваш код и рабочий код API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...