android - 使用Retrofit2和recyclerview进行嵌套JSON,响应不兼容

标签 android json android-recyclerview gson retrofit2

因此,我一直在尝试使用 Retrofit2 解析嵌套 JSON 并将其显示到回收器 View 中。

我面临的问题是响应与对象不兼容。 下面的代码和表示将帮助读者更好地理解。

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

在这两种情况下,错误都是

'TransactionsAdapter(android.content.Context, java.util.List)' in 'in.sid.POJO.TransactionsAdapter' cannot be applied to '(android.content.Context, in.sid.POJO.Transactions)'

视觉表现

enter image description here

此外,我尝试更改 recyclerviewadapter 以在没有 List<> 的情况下工作,但我无法使其工作,并且无法更改 API 调用,因为当我这样做时,它会给出以下错误

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

最后,我很乐意提供更多信息,但目前我会保持较小的规模。

更新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());

关于android - 使用Retrofit2和recyclerview进行嵌套JSON,响应不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453943/

相关文章:

android - 从模板 XML 文件创建 TextView

php - 将 JSONArray 从 Android 传递到 PHP

java - 在 Recyclerview 中使用 picasso 时出现 IllegalArgumentException : Context must not be null.

android - android中各种颜色的功耗

android - FeatureDetector.detect()函数错误

javascript - Nodejs - 从嵌套和非嵌套 json 中检索值

php - 如何使用 json api 将 Lat Long 转换为 php 中的地址?

java - 可运行的 setClickListener 不起作用

android - ListView会自动回收 View 吗?

android - 从代码中检测 App 是否为生产/发布版本