【问题标题】:Server Data is not fetching in Retrofit在改造中未获取服务器数据
【发布时间】:2018-09-18 15:20:24
【问题描述】:

我想使用RecyclerView 上的retrofitlibrary 从服务器获取一些数据,但数据未显示在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": "**********"
    }
  ]
 }

我使用了基本 URL、GSON 和改造对象的 API 客户端类

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

getter 设置类

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

【问题讨论】:

  • 您确定 API 返回正确的数据吗?你确定可以通过局域网访问吗?你用邮递员客户端检查过吗?有时 Windows/Antivirus 的防火墙会干扰从客户端发送到服务器的请求。只需打开防火墙并尝试。
  • 是的,首先我检查了 Postman,数据以 JSON 格式出现。

标签: android retrofit retrofit2


【解决方案1】:

您需要像这样更改您的 ApiServices 接口

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

然后在您的 Activity 中更新调用方法

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 代码。

【讨论】:

  • 我的代码和你说的一样,但它在 Adapter 类中的 holder.itemName 上显示 NullPointerException
  • @ParamjeetSingh 您需要在您的视图持有者ButterKnife.bind(this, itemView) 中更新它。所以基本上你的视图没有初始化,这就是你得到 NullPointerException 的原因
  • 好的先生,谢谢您的回复,明天我会检查并告诉您...
  • 数据还没来
  • @ParamjeetSingh 你能和我分享一下 Api。我尝试了您在代码中设置的那个,但那不起作用。您是如何在 PostMan 上验证的?
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 2021-08-30
  • 1970-01-01
  • 2019-11-14
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多