android - 使用 Retrofit2 和 recyclerview 进行嵌套 JSON,响应不兼容
问题描述
因此,我一直在尝试使用 retrofit2 解析嵌套的 JSON 并将其显示到回收器视图中。
我面临的问题是响应与对象不兼容。以下代码和表示将帮助读者更好地理解。
public class FragmentTransaction extends Fragment {
Transactions transactions;
RecyclerView recyclerView;
TransactionsAdapter transactionsAdapter;
private View view;
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstanceState){
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
transactionsAdapter = new TransactionsAdapter(getContext(), transactions); //first occurrence of error
recyclerView.setAdapter(transactionsAdapter);
APIInterface apiInterface = APIClient.getClient().create(APIInterface.class);
Call<Transactions> call = apiInterface.getTransactionList(sharedPreferences.getString(UNIQUE_ID, "qwe"));
call.enqueue(new Callback<Transactions>() {
@Override
public void onResponse(Call<Transactions> call, Response<Transactions> response) {
transactions = response.body();
Log.d("5", "Passing to Adapter");
try {
transactionsAdapter.setTransactionsList(transactions); //second occurrence of error
Log.d("4", "Passed to Adapter");
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onFailure(Call<Transactions> call, Throwable t) {
Log.d("6", "Passing to Adapter Failure", t);
}
});
在这两种情况下,错误都是
'in.sid.POJO.TransactionsAdapter' 中的'TransactionsAdapter(android.content.Context, java.util.List)' 不能应用于'(android.content.Context, in.sid.POJO.Transactions)'
视觉表示
另外,我尝试将 recyclerviewadapter 更改为在没有 List<> 的情况下工作,但我无法使其工作并且我无法更改 API 调用,因为当我这样做时,它给了我以下错误
预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT
最后,我很乐意提供更多信息,但现在我保持这个小。
更新 1
适配器类
public class TransactionsAdapter extends RecyclerView.Adapter<TransactionsAdapter.MyViewHolder>{
private Context context;
private List <Transactions> TransactionsList;
public TransactionsAdapter(Context context, List<Transactions> TransactionsList) {
this.context = context;
this.TransactionsList = TransactionsList;
}
public void setTransactionsList(List<Transactions> transactionsList){
this.TransactionsList = transactionsList;
notifyDataSetChanged();
}
@Override
public TransactionsAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(TransactionsAdapter.MyViewHolder holder, int position) {
Transactions transactionsList = TransactionsList.get(position);
Transactions.DataEntity dataEntity = transactionsList.getData().get(0);
holder.associateName.setText(dataEntity.getAssociate().getName());
}
@Override
public int getItemCount() {
return 0;
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView associateName;
TextView transactionDate;
public MyViewHolder(View itemView) {
super(itemView);
associateName = (TextView)itemView.findViewById(R.id.nameAssociate);
transactionDate = (TextView)itemView.findViewById(R.id.dateTransaction);
}
}
}
回复
{
"status": "success",
"status_code": "200",
"data": [
{
"transaction_id": "2",
"transaction_date": "2018-04-19 05:27:23.0",
"amount": "200.00",
"user_id": "2",
"currency": "MXN",
"associate_id": "1",
"associate": {
"is_active": "N",
"associate_type": "Autoservicio",
"name": "alsuper",
"created_date": "12-Feb-2018 07:31:58 AM",
"associate_id": "1",
"url": null,
"last_update_date": "12-Feb-2018 07:31:58 AM"
},
"card_id": "2",
"card": {
"bank_code": "002",
"is_active": "Y",
"allows_charges": "Y",
"card_number": "411111XXXXXX1111",
"openpay_card_id": "kiusphu8moqri6qys7sg",
"type": "debit",
"card_id": "2",
"expiration_year": "21",
"user_id": "2",
"expiration_month": "10",
"bank_name": "bank name",
"created_date": "21-Mar-2018 05:46:58 AM",
"brand": "visa",
"last_update_date": "21-Mar-2018 05:46:58 AM",
"holder_name": "name name name name"
}
}
]
}
POJO类
public class Transactions {
@SerializedName("data")
private List<DataEntity> data;
@SerializedName("status_code")
private String statusCode;
@SerializedName("status")
private String status;
public List<DataEntity> getData() {
return data;
}
public void setData(List<DataEntity> data) {
this.data = data;
}
public String getStatusCode() {
return statusCode;
}
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public static class DataEntity {
@SerializedName("card")
private CardEntity card;
@SerializedName("card_id")
private String cardId;
@SerializedName("associate")
private AssociateEntity associate;
@SerializedName("associate_id")
private String associateId;
@SerializedName("currency")
private String currency;
@SerializedName("user_id")
private String userId;
@SerializedName("amount")
private String amount;
@SerializedName("transaction_date")
private String transactionDate;
@SerializedName("transaction_id")
private String transactionId;
}
public static class CardEntity {
@SerializedName("holder_name")
private String holderName;
@SerializedName("last_update_date")
private String lastUpdateDate;
@SerializedName("brand")
private String brand;
@SerializedName("created_date")
private String createdDate;
@SerializedName("bank_name")
private String bankName;
@SerializedName("expiration_month")
private String expirationMonth;
@SerializedName("user_id")
private String userId;
@SerializedName("expiration_year")
private String expirationYear;
@SerializedName("card_id")
private String cardId;
@SerializedName("type")
private String type;
@SerializedName("openpay_card_id")
private String openpayCardId;
@SerializedName("card_number")
private String cardNumber;
@SerializedName("allows_charges")
private String allowsCharges;
@SerializedName("is_active")
private String isActive;
@SerializedName("bank_code")
private String bankCode;
}
public static class AssociateEntity {
@SerializedName("last_update_date")
private String lastUpdateDate;
@SerializedName("associate_id")
private String associateId;
@SerializedName("created_date")
private String createdDate;
@SerializedName("name")
private String name;
@SerializedName("associate_type")
private String associateType;
@SerializedName("is_active")
private String isActive;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
解决方案
首先创建 private ArrayList<DataEntity> listItems = new ArrayList<>();
然后在设置适配器
transactionsAdapter = new TransactionsAdapter(getContext(), listItems);
在 onResponse
listItems.addAll(response.body().getData());
推荐阅读
- javascript - 如何在 useState 对象中调用变量(Reactjs)
- flutter - 如何在 Flutter 中导入视频中的字幕文件?
- elasticsearch - elasticsearch 查询的问题,范围格式错误的查询,预期 END_OBJECT 但找到 FIELD_NAME
- ios - 等到 swift for loop 网络请求完成执行(不使用任何框架的原生)
- docker - Docker 端口问题绑定:无法分配请求的地址
- python - 通过两个表减去产品
- oracle - 当将用户输入从一个 jsp 传递到另一个 jsp 时,我在 executeQuery() 上遇到异常
- php - 生成 100000 个六位唯一字母数字代码
- java - 如何检测 Java 中的方法调用?
- julia - 可用作宏中的运算符的 ASCII 字符序列