繁体   English   中英

如何在 Android Recyclerview 中显示 JSON 数组中包含的 JSON 对象

[英]How to show JSON objects included in JSON Array in Android Recyclerview

我有以下 JSON 数据,即一个数组中有 10 个对象。 我在 recyclerview 中获取对象,没有任何错误。

现在我需要做两件事:

  1. 我想在用户滚动 recyclerview 时显示下一页数据,即(接下来的 10 条记录,依此类推)。
  2. 我想在每个 object 的 recyclerview 中显示 total_quotes。 在显示总报价时,我在 null object 参考上面临“LeadsMeta.getTotalQuotes()”这个错误。

我已经在适配器的 onBind 中评论了该行。

请帮我解决这两个问题。 提前谢谢了。

JSON 数据

{
   "meta":{
      "code":200,
      "message":"success",
      "total_pages":247,
      "current_page":1,
      "total_items":2469,
      "total_quotes":5
   },
   "data":[
      {
         "id":"4968",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Pune",
         "name":"Shashikant ",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 21:53:38"
      },
      {
         "id":"4963",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Bangalore",
         "name":"Amani",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:46:03"
      },
      {
         "id":"4962",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Delhi",
         "name":"Mechanical Engineer",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:23:00"
      },
      {
         "id":"4961",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Mumbai",
         "name":"Ankush patil",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:20:20"
      },
      {
         "id":"4960",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Delhi",
         "name":"ER Vikash Thakur",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:17:32"
      },
      {
         "id":"4957",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Kolkata",
         "name":"Shiladitya Ghosh",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:09:44"
      },
      {
         "id":"4956",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Delhi",
         "name":"Vikash",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 20:08:44"
      },
      {
         "id":"4953",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Rishikesh",
         "name":"Rahul",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 19:51:17"
      },
      {
         "id":"4950",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Pune",
         "name":"Abhishek",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 19:43:27"
      },
      {
         "id":"4949",
         "topic":"Topic",
         "sub_topic":"Sub Topic",
         "city":"Chandigarh ",
         "name":"K Singh ",
         "quotes":"0",
         "credits":"10",
         "timestamp":"2021-01-05 19:40:36"
      }
   ]
}

我的片段:

public class LeadsFragment extends Fragment {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    private static final String url = "myurl";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_leads, container, false);

        recyclerView = view.findViewById(R.id.recyclerview);

        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                GsonBuilder gsonBuilder = new GsonBuilder();
                Gson gson = gsonBuilder.create();
                LeadModel leadsModelList = gson.fromJson(response, LeadModel.class);

                recyclerView.setHasFixedSize(true);
                layoutManager = new LinearLayoutManager(getActivity());
                recyclerView.setLayoutManager(layoutManager);
                LeadsAdapter leadsAdapter = new LeadsAdapter(getContext(), leadsModelList, recyclerView);
                recyclerView.setAdapter(leadsAdapter);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getContext(), error.toString(), Toast.LENGTH_SHORT).show();

            }
        });

        RequestQueue queue = Volley.newRequestQueue(getContext());
        queue.add(stringRequest);

        return view;
    }
}

我的适配器:

public class LeadsAdapter extends RecyclerView.Adapter<LeadsAdapter.ViewHolder> {

    Context context;
    LeadModel leadsModelList;
    RecyclerView recyclerView;
    final View.OnClickListener onClickListener = new MyOnClickListener();

    public LeadsAdapter(Context context, LeadModel leadsModelList, RecyclerView recyclerView) {
        this.context = context;
        this.leadsModelList = leadsModelList;
        this.recyclerView = recyclerView;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView name, topic, sub_topic, city, credits, quotes;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.tvName);
            topic = itemView.findViewById(R.id.tvTopic);
            sub_topic = itemView.findViewById(R.id.tvSubTopic);
            city = itemView.findViewById(R.id.tvLocation);
            credits = itemView.findViewById(R.id.tvCredits);
            quotes = itemView.findViewById(R.id.tvQuotes);
        }
    }

    @NonNull
    @Override
    public LeadsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.lead_card, viewGroup, false);
        view.setOnClickListener(onClickListener);
        LeadsAdapter.ViewHolder viewHolder = new LeadsAdapter.ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull LeadsAdapter.ViewHolder viewHolder, int position) {

        viewHolder.name.setText(leadsModelList.getData().get(position).getName());
        viewHolder.topic.setText(leadsModelList.getData().get(position).getTopic());
        viewHolder.sub_topic.setText(leadsModelList.getData().get(position).getSubTopic());
        viewHolder.city.setText(leadsModelList.getData().get(position).getCity());
        viewHolder.credits.setText(leadsModelList.getData().get(position).getCredits()+ " Credits");
//        viewHolder.quotes.setText(leadsModelList.getData().get(position).getQuotes()+"/"+ leadsModelList.getMeta().getTotalQuotes() +" Quotes");
    }

    @Override
    public int getItemCount() {
        return leadsModelList.getData().size();
    }

        }
    }
}

Model Class:

public class LeadModel {

    @SerializedName("leadsMeta")
    @Expose
    private LeadsMeta leadsMeta;
    @SerializedName("data")
    @Expose
    private List<LeadsData> data = null;

    public LeadsMeta getMeta() {
        return leadsMeta;
    }

    public void setMeta(LeadsMeta leadsMeta) {
        this.leadsMeta = leadsMeta;
    }

    public List<LeadsData> getData() {
        return data;
    }

    public void setData(List<LeadsData> data) {
        this.data = data;
    }

}

元 Class

public class LeadsMeta {

    @SerializedName("code")
    @Expose
    private Integer code;
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("total_pages")
    @Expose
    private Integer totalPages;
    @SerializedName("current_page")
    @Expose
    private Integer currentPage;
    @SerializedName("total_items")
    @Expose
    private Integer totalItems;
    @SerializedName("total_quotes")
    @Expose
    private Integer totalQuotes;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getTotalItems() {
        return totalItems;
    }

    public void setTotalItems(Integer totalItems) {
        this.totalItems = totalItems;
    }

    public Integer getTotalQuotes() {
        return totalQuotes;
    }

    public void setTotalQuotes(Integer totalQuotes) {
        this.totalQuotes = totalQuotes;
    }

}

数据 Class

public class LeadsData {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("topic")
    @Expose
    private String topic;
    @SerializedName("sub_topic")
    @Expose
    private String subTopic;
    @SerializedName("city")
    @Expose
    private String city;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("quotes")
    @Expose
    private String quotes;
    @SerializedName("credits")
    @Expose
    private String credits;
    @SerializedName("timestamp")
    @Expose
    private String timestamp;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }

    public String getSubTopic() {
        return subTopic;
    }

    public void setSubTopic(String subTopic) {
        this.subTopic = subTopic;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getQuotes() {
        return quotes;
    }

    public void setQuotes(String quotes) {
        this.quotes = quotes;
    }

    public String getCredits() {
        return credits;
    }

    public void setCredits(String credits) {
        this.credits = credits;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

}

“元” object 的序列化名称在您的 LeadModel class 中应为“元”。

public class LeadModel {
     
    //@SerializedName("leadsMeta")

    @SerializedName("meta")
    @Expose
    private LeadsMeta leadsMeta;}
  1. 我想显示下一页数据

请在您的 recyclerview 上使用recyclerView.addOnScrollListener 当用户滚动并到达最后一项时,您需要加载更多 10 项和 append 列表到现有列表

public class LeadsFragment extends Fragment {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    private static final String url = "myurl";
    boolean isLoading = false; // For Tracking  


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ......
    ........
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

                if (!isLoading) {
                    if (linearLayoutManager != null && linearLayoutManager.findLastCompletelyVisibleItemPosition() == yourList.size() - 1) {
                        // Last item reached
                        loadMore(); // Note this method
                        isLoading = true;
                    }
                }

            }
        });

 private void loadMore() {
        // Make http Request
        // append the new data to LeadsData
        // notifyAdapter items changed
        // set isLoading = false
    }
  1. 我在 null object 参考上面临“LeadsMeta.getTotalQuotes()”

这是因为您在 LeadModel 中的序列化名称应该与您的 json 一致

@SerializedName("meta")

对于您的第一个问题:

您需要检查代码。 在 MainActivity.java class 中有一个方法 loadMore()。 在您的情况下,您需要执行 API 调用以加载另外 10 个项目,然后通知您的适配器您有新项目,它将将它们加载到您的列表中。 这就是你如何用无穷无尽的项目来实现你的recyclerview。

对于第二个问题:

您应该在@SerializedName 中将leadsMeta更改meta 这是您编辑的 class:

public class LeadModel {

    @SerializedName("meta")
    @Expose
    private LeadsMeta leadsMeta;
    @SerializedName("data")
    @Expose
    private List<LeadsData> data = null;

    public LeadsMeta getMeta() {
        return leadsMeta;
    }

    public void setMeta(LeadsMeta leadsMeta) {
        this.leadsMeta = leadsMeta;
    }

    public List<LeadsData> getData() {
        return data;
    }

    public void setData(List<LeadsData> data) {
        this.data = data;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM