【问题标题】:Parse nested JSON values and display in recyclerview while sorting date wise解析嵌套的 JSON 值并在 recyclerview 中显示,同时按日期排序
【发布时间】:2018-07-15 06:00:35
【问题描述】:

所以我必须解析以下 JSON 并在两步回收器视图中显示数据,也就是说,在第一个屏幕应用程序应该只显示 Associate name 和 Amount,

但如果我点击某个列表项,它也应该显示其余数据。

另外,我知道我必须为实现 Comparable 接口的响应创建一个 Model 类。

该类将覆盖compareTo 方法,该方法将根据transaction_date 对交易进行排序。 但是我无法理解整个过程,因为当我生成 POJO 类时,我得到了四个不同的 java 类(Transaction、Datum、Card、Associate)。当我为 recyclerview 创建适配器时,我无法直接访问 "amount" 字段,因为它存在于另一个类中。

{
    "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"
            }
        }
   ]
}

我很高兴分享适配器类,现在我没有分享是因为我想对这个问题有一些新的看法。

更新 1

所以在应用 Raja Jawahar 的解决方案后,我能够运行一次,但是在进行最后的更改后,出现了以下情况。

D/1: Loaded View
D/2: Loaded recycler View
I/art: Do partial code cache collection, code=22KB, data=30KB
       After code cache collection, code=22KB, data=30KB
       Increasing code cache capacity to 128KB
D/OkHttp: --> GET http://URL http/1.1
          --> END GET
E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException:  (No such file or directory)
W/ImageView: resolveUri failed on bad bitmap uri: 
D/OkHttp: <-- 200  http:URL (757ms)
          Access-Control-Allow-Origin: *
          Access-Control-Allow-Headers: Content-Type, Accept, X-Requested-With
          Content-Type: application/json
          Content-Length: 4109
D/OkHttp: Date: Sun, 15 Jul 2018 13:42:20 GMT
D/OkHttp: {"status":"success","status_code":"200","data": DATA]}
          <-- END HTTP (4109-byte body)
D/6: Passing to Adapter Failure
     java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我的支持代码如下,

片段

TransactionAssociate = new ArrayList<>();
        recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        transactionsAdapter = new TransactionsAdapter(getContext(), TransactionAssociate);
        recyclerView.setAdapter(transactionsAdapter);
        Log.d("2", "Loaded recycler View");
        APIInterface apiInterface = APIClient.getClient().create(APIInterface.class);
        Call<List<Transactions>> call = apiInterface.getTransactionList(sharedPreferences.getString(UNIQUE_ID, "qwe"));
        call.enqueue(new Callback<List<Transactions>>() {
            @Override
            public void onResponse(Call<List<Transactions>> call, Response<List<Transactions>> response) {

                TransactionAssociate = response.body();
                Log.d("5", "Passing to Adapter");
                try {
                    transactionsAdapter.setTransactionsList(TransactionAssociate);
                    Log.d("4", "Passed to Adapter");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<List<Transactions>> call, Throwable t) {
                Log.d("6", "Passing to Adapter Failure", t);
            }
        });

Http 接口

@GET("URL")
Call<List<Transactions>>getTransactionList(@Path(value = "user_id",encoded = true)String user_id);

适配器

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

    @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{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

Transactions.class

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

}

【问题讨论】:

    标签: android json retrofit2 android-recyclerview


    【解决方案1】:

    使用 DTO Generator(Android Plugin 创建模型类)

    为您的响应创建一个如下所示的类

    public class DataModel {
    
      @SerializedName("data")   private List<Data> data;   @SerializedName("status_code")   private String status_code;   @SerializedName("status")   private String status;
         public static class Data {
        @SerializedName("card")
        private Card card;
        @SerializedName("card_id")
        private String card_id;
        @SerializedName("associate")
        private Associate associate;
        @SerializedName("associate_id")
        private String associate_id;
        @SerializedName("currency")
        private String currency;
        @SerializedName("user_id")
        private String user_id;
        @SerializedName("amount")
        private String amount;
        @SerializedName("transaction_date")
        private String transaction_date;
        @SerializedName("transaction_id")
        private String transaction_id;   }
    
      public static class Card {
        @SerializedName("holder_name")
        private String holder_name;
        @SerializedName("last_update_date")
        private String last_update_date;
        @SerializedName("brand")
        private String brand;
        @SerializedName("created_date")
        private String created_date;
        @SerializedName("bank_name")
        private String bank_name;
        @SerializedName("expiration_month")
        private String expiration_month;
        @SerializedName("user_id")
        private String user_id;
        @SerializedName("expiration_year")
        private String expiration_year;
        @SerializedName("card_id")
        private String card_id;
        @SerializedName("type")
        private String type;
        @SerializedName("openpay_card_id")
        private String openpay_card_id;
        @SerializedName("card_number")
        private String card_number;
        @SerializedName("allows_charges")
        private String allows_charges;
        @SerializedName("is_active")
        private String is_active;
        @SerializedName("bank_code")
        private String bank_code;   }
    
      public static class Associate {
        @SerializedName("last_update_date")
        private String last_update_date;
        @SerializedName("associate_id")
        private String associate_id;
        @SerializedName("created_date")
        private String created_date;
        @SerializedName("name")
        private String name;
        @SerializedName("associate_type")
        private String associate_type;
        @SerializedName("is_active")
        private String is_active;   } }
    

    在您的适配器中访问您的 DataModel,如下所示

    package com.mobieadz.sales;
    
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.view.ViewGroup;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MyRecylerViewAdapter extends RecyclerView.Adapter<MyRecylerViewAdapter.MyViewHolder> {
    
      private Context context;
      private List<Data> datas = new ArrayList<>();
    
      @NonNull @Override
      public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
          int viewType) {
        return null;
      }
    
      public MyRecylerViewAdapter(Context context, List<DataModel> dataModels) {
        this.context = context;
        this.dataModels = dataModels;
      }
    
      @Override
      public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    
       Data data = datas.get(position);
        youtextView.setText(data.amount);
        yourtextView.setText(data.associate.name)
        yourtextView.setText(data.associate.name)
    
      }
    
      @Override public int getItemCount() {
    return dataModels.size();
      }
    
      public class MyViewHolder extends RecyclerView.ViewHolder {
    
        public MyViewHolder(View itemView) {
          super(itemView);
        }
      }
    }
    

    【讨论】:

    • 一定会试试这个,并会让你知道。 !
    • 如果您有任何问题,请告诉我,Siddhant Ghosh
    • 快乐编码@SiddhantGhosh
    • @SiddhantGhosh 你的事务类有问题,我想.. 你能发布事务类吗
    猜你喜欢
    • 2019-02-02
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多