【问题标题】:Parse Error Retrieved JsonArrayRequest Using PHP to RecyclerView On Fragments Volley解析错误检索 JsonArrayRequest 使用 PHP 到 RecyclerView 在 Fragments Volley
【发布时间】:2016-06-01 08:56:58
【问题描述】:

我正在Fragments 上练习实现recyclerView(我的第一次),我想从我的服务器(phpMyAdmin)中检索这些数据。我对php和mysql有一点背景。我想要的只是以一种非常简单的方式获取我的数据,在cardView - recyclerView 中显示我的数据。当我查看我的 java 代码时,它现在似乎(更正后)。

当我调试我的应用程序时,我发现它不会转到我的onResponse,而是转到ErrorResponse我该如何正确解析?

这是我的片段:OrganizationAboutFragment .java

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

    recyclerView = (RecyclerView) inflater.inflate(
            R.layout.recycler_view, container, false);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);

    orgListAdapter = new OrgListAdapter(organizationDataList);
    recyclerView.setAdapter(orgListAdapter);
    //GET DATA REQUEST
    parseJSONData();

    return recyclerView;
}

public void parseJSONData(){
    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    JsonArrayRequest jsonArray = new JsonArrayRequest(ServerScripts.PHP_SCRIPT_PATH + ServerScripts.PHP_GET_FEEDS, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            if (response.length() > 0){
                try {
                    organizationDataList.clear();
                    for (int i = 0; i < response.length(); i++ ){
                        JSONObject jsonObject = response.getJSONObject(i);
                        OrganizationData organizationData = new OrganizationData();

                        //SQL TABLE NAME
                        if (!jsonObject.isNull("orgName")){
                            organizationData.orgName = jsonObject.getString("orgName");
                        }

                        if (!jsonObject.isNull("orgDesc")){
                            organizationData.orgDesc = jsonObject.getString("orgDesc");
                        }

                        if (!jsonObject.isNull("orgCategory")){
                            organizationData.orgCategory = jsonObject.getString("orgCategory");
                        }

                        if (!jsonObject.isNull("orgCurrentMembers")){
                            organizationData.orgCurrentMembers = jsonObject.getInt("orgCurrentMembers");
                        }

                        if (!jsonObject.isNull("orgMaxMembers")){
                            organizationData.orgMaxMembers = jsonObject.getInt("orgMaxMembers");
                        }

                        if (!jsonObject.isNull("orgType")){
                            organizationData.orgType = jsonObject.getString("orgType");
                        }
                        //ADD
                        organizationDataList.add(organizationData);
                    }
                        //NOTIFY
                        orgListAdapter.notifyDataSetChanged();

                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }

    });
    requestQueue.add(jsonArray);

我的适配器:OrgListAdapter.java

public class OrgListAdapter extends RecyclerView.Adapter<OrgListAdapter.OrgViewHolder>{

private List<OrganizationData> mOrganizationData;

public OrgListAdapter(List<OrganizationData> mOrganizationData){
    this.mOrganizationData = mOrganizationData;
}

@Override
public OrgViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_cardview_flat_organizations,parent,false);
    OrgViewHolder myOrgViewHolder = new OrgViewHolder(view);

    return myOrgViewHolder;
}

@Override
public void onBindViewHolder(OrgViewHolder holder, int position) {
    //ORG MODELS PASS TO CARD VIEW - HOLDER
    holder.appCompatTextViewName.setText(mOrganizationData.get(position).getOrgName());
    holder.appCompatTextViewCategory.setText(mOrganizationData.get(position).getOrgCategory());
    holder.appCompatTextViewDesc.setText(mOrganizationData.get(position).getOrgDesc());
    holder.appCompatTextViewJoinMembers.setText(mOrganizationData.get(position).getOrgCurrentMembers());
    holder.appCompatTextViewMaxMembers.setText(mOrganizationData.get(position).getOrgMaxMembers());

}

@Override
public int getItemCount() {
    if (mOrganizationData != null){
        return mOrganizationData.size();
    }
    return 0;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}


public static class OrgViewHolder extends RecyclerView.ViewHolder{

    CardView cardViewOrg;
    AppCompatTextView appCompatTextViewName;
    AppCompatTextView appCompatTextViewDesc;
    AppCompatTextView appCompatTextViewJoinMembers;
    AppCompatTextView appCompatTextViewMaxMembers;
    AppCompatTextView appCompatTextViewCategory;


    AppCompatImageView appCompatImageViewOrgType;
    String getDataStoredUniqueId = "";

    //Buttons
    AppCompatButton appCompatButtonJoin;
    AppCompatButton appCompatButtonFollow;
    AppCompatButton appCompatButtonReadMore;

    public OrgViewHolder(View getView){
        super(getView);

        cardViewOrg = (CardView) getView.findViewById(R.id.card_view_org);
        appCompatTextViewName = (AppCompatTextView) getView.findViewById(R.id.textViewOrgName);
        appCompatTextViewCategory = (AppCompatTextView) getView.findViewById(R.id.textViewCategory);
        appCompatTextViewDesc = (AppCompatTextView) getView.findViewById(R.id.textViewOrgShortDesc);
        appCompatTextViewJoinMembers = (AppCompatTextView) getView.findViewById(R.id.currentMembers);
        appCompatTextViewMaxMembers = (AppCompatTextView) getView.findViewById(R.id.maxMembers);
        appCompatImageViewOrgType = (AppCompatImageView) getView.findViewById(R.id.orgTypeIndicator);

        //Buttons
        appCompatButtonJoin = (AppCompatButton) getView.findViewById(R.id.imageButtonJoined);
        appCompatButtonFollow = (AppCompatButton) getView.findViewById(R.id.imageButtonFollow);
        appCompatButtonReadMore = (AppCompatButton) getView.findViewById(R.id.buttonMoreOrg);

    }

}

我的php代码:orgList.php

<?php

//if($_SERVER['REQUEST_METHOD'] == ''){


     require('dbConnect.php');

     $SQLi_ORG_FEEDS = "SELECT organizationName,organizationDescription,organizationCategory,
                        organizationCurrentMembers,organizationMaxMembersNo,organizationType FROM org_information";

     $query = mysqli_query($dbConnect,$SQLi_ORG_FEEDS) or die("Error".mysqli_error($dbConnect));

     $checkRow = mysqli_num_rows($query);

     $response = array();

     if($checkRow > 0){
         while ($getRecord = mysqli_fetch_array($query)) {
            $response["organizationName"] = $getRecord;
            $response["organizationType"] = $getRecord;
            $response["organizationDescription"] = $getRecord;  
            $response["organizationCategory"] = $getRecord;
            $response["organizationCurrentMembers"] = $getRecord;
            $response["organizationMaxMembersNo"] = $getRecord;                
         }

         echo json_encode($response);
     }

//} 

【问题讨论】:

  • 也没有初始化organizationDataList
  • @ρяσѕρєя K 是的,对

标签: java php android json android-fragments


【解决方案1】:

parseJSONDataonResponse 中,您创建了一个新的OrganizationData 对象并正确解析,但是您永远不会将此对象添加到任何列表中。

您的 for 循环中缺少 organizationDataList.add(organizationData);

另一个提示是在此之后立即调用notifyItemInserted,或者在循环之后移动您的notifyDataSetChanged :)

【讨论】:

  • 在我的php代码中,对吗?我也怀疑它是由我的 phpCode 引起的。我会检查我的 for 循环。感谢您的宝贵时间。
  • 先生,你能帮我解决这个问题吗?图片中的错误。
  • 好吧,我不熟悉 PHP,但是显示的错误似乎是因为您的服务器返回的格式格式不正确,或者不是 json 格式。按照这里的建议(stackoverflow.com/a/25493444/4706693),尝试安装RESTClient 看看发生了什么
  • 感谢您的回答,是的,我现在正在尝试使用邮递员。
【解决方案2】:

只需在你的 for 循环中添加这一行

organizationDataList.add(organizationData);

orgListAdapter.notifyDataSetChanged(); // 循环后

【讨论】:

  • 我还是没有得到回应。 :(
  • @RoCk 你初始化了 organizationDataList 吗?并调试你的 parseJSONData() 你会得到它
  • 这是你的意思吗? ArrayList organizationDataList = new ArrayList();
  • @RoCk 是的这个
  • 我添加了这些代码并修改了我的 - (for loop) ,仍然没有得到任何提要。我相信这与php代码有关。
【解决方案3】:

尝试使用改造。它比凌空更快,你不需要解析你的 JSON(标准 JSON 响应)。由于改造只接受标准 JSON 格式。您必须通过 Main MODEL 类来存储数据。这是伟大的教程。您将永远不必解析 JSON。只需使用并从 response.body.yourPOJO() 获取数据;

如果有帮助,试试这个。

http://www.androidwarriors.com/2015/12/retrofit-20-android-example-web.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多