【问题标题】:Recyclerview android with volley JsonArrayRequest with post parametersRecyclerview android 带有 volley JsonArrayRequest 和 post 参数
【发布时间】:2018-08-29 15:22:11
【问题描述】:

我想用 JSON 数组加载我的 recyclerview。我为此使用凌空抽射。

我现在使用的是StringRequest

我想发布 id 作为响应,我会得到 JSON 数组。

我收到了回复,但我的 ArrayList 显示错误

statuslist ='this' is not available

下面是我的代码。

private ArrayList<Main_lead_data> statusList = new ArrayList<>();
private RecyclerView mainleadRecycler;
private Main_lead_Adpater mainleadRecycler_Adpter;

    mainleadRecycler = findViewById(R.id.idRecyclerViewHorizontalList);
    mainleadRecycler.addItemDecoration(new DividerItemDecoration(MainActivity.this, LinearLayoutManager.HORIZONTAL));
    mainleadRecycler_Adpter = new Main_lead_Adpater(this,statusList);
    LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
    mainleadRecycler.setLayoutManager(horizontalLayoutManager);
    mainleadRecycler.setAdapter(mainleadRecycler_Adpter);

  public void getLeadStatus(){

    final ProgressDialog progressBar = new ProgressDialog(MainActivity.this);
    progressBar.setMessage("Loading..");
    progressBar.show();
    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
    StringRequest stringRequest = new StringRequest(Request.Method.POST,leadstatus_url,
            new com.android.volley.Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if(!response.isEmpty()){
                        try {
                            JSONArray jsonarray=new JSONArray(response);
                          statusList =new ArrayList<Main_lead_data>();

                            for(int i=0;i<jsonarray.length();i++)
                            {
                                JSONObject jsonobject = jsonarray.getJSONObject(i);

                                Main_lead_data data=new Main_lead_data();

                                data.setStatusName((jsonobject.optString("name")));
                                data.setStatusCount(jsonobject.optString("data"));
                                data.setStaus_id(jsonobject.optString("sid"));

                                statusList.add(data);
                            }

                            progressBar.dismiss();
                        } catch (JSONException e) {
                            progressBar.dismiss();
                            Toast.makeText(MainActivity.this,"Server Not Responding..Please Try Again",Toast.LENGTH_SHORT).show();
                            Log.e("catchException",e.toString());
                            e.printStackTrace();
                        }
                    }
                    else {
                        progressBar.dismiss();
                        Toast.makeText(MainActivity.this,"Server Not Responding",Toast.LENGTH_SHORT).show();
                        Log.e("error","Empty Response");
                    }
                }
            },
            new com.android.volley.Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("error",error.toString());
                    progressBar.dismiss();
                    Toast.makeText(MainActivity.this,"Server Not Responding",Toast.LENGTH_SHORT).show();
                }
            }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("company_id",companyId );

            return params;
        }
    };

    requestQueue.add(stringRequest);
}

我也想知道如何在 JsonArrayRequest 方法中传递 post 参数并获得响应。

下面是适配器类:

public class Main_lead_Adpater extends RecyclerView.Adapter<Main_lead_Adpater.ViewHolder> {
    private Context context;
    private ArrayList<Main_lead_data> lead_data ;
    LinearLayout view_linear;

    public Main_lead_Adpater(Context context,ArrayList<Main_lead_data> lead_data) {
        this.context = context;
        this.lead_data=lead_data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_lead_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        Main_lead_data lead_status = lead_data.get(position);

        holder.textCount.setText(lead_status.getStatusCount());
        holder.textName.setText(String.valueOf(lead_status.getStatusName()));
        holder.textId.setText(String.valueOf(lead_status.getStaus_id()));

        view_linear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView textCount, textName, textId;

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

            textCount = itemView.findViewById(R.id.total_count);
            textName = itemView.findViewById(R.id.status_name);
            textId = itemView.findViewById(R.id.sid_tv);
            view_linear=(LinearLayout)itemView.findViewById(R.id.view_linear);

        }
    }
}

以下是 JSON 响应:

[
{
    "name": "New Enquiry",
    "data": "23",
    "sid": "1"
},
{
    "name": "Interested",
    "data": "4",
    "sid": "2"
},
{
    "name": "Not Interested",
    "data": "5",
    "sid": "3"
},
{
    "name": "Proposal Sent",
    "data": "5",
    "sid": "4"
},
{
    "name": "Ongoing",
    "data": "8",
    "sid": "6"
},
{
    "name": "Converted Client",
    "data": "6",
    "sid": "7"
},
{
    "name": "Lost",
    "data": "27",
    "sid": "8"
}]

谢谢。

【问题讨论】:

  • 你的 json 响应是什么
  • 添加了 json 响应
  • 可以分享一下错误日志吗?
  • 没有得到任何错误......它与 asynctask 一起工作正常,但在 volley 上,arraylist 显示 statuslist ='this' is not available
  • 你正在创建新的statuslist实例,你是如何初始化适配器的?

标签: android android-recyclerview android-volley


【解决方案1】:

在获取arraylist后尝试使用适配器的调用构造函数,然后设置适配器。这样会起作用

【讨论】:

  • 用于设置适配器的arraylist中应该有一些东西,我的arraylist是空白的。它没有被填充。
【解决方案2】:

您需要使用空列表更新您已有的适配器列表。当您从服务器获得响应时,将列表添加到适配器。

将此方法添加到适配器

 public void addItems(ArrayList<Main_lead_data> dataList){
        lead_data.addAll(dataList); 
        notifyDataSetChanged();
    }

此方法将添加列表中的所有数据并将数据填充到 RecyclerView。

改变你onResponse这样的代码:

if(!response.isEmpty()){
      try {
           JSONArray jsonarray=new JSONArray(response);
         // No need to reinitialize statusList here. You already initialize this 
         //  statusList = new ArrayList<Main_lead_data>();

           for(int i=0;i<jsonarray.length();i++)
           {
              JSONObject jsonobject = jsonarray.getJSONObject(i);

              Main_lead_data data = new Main_lead_data();

              data.setStatusName((jsonobject.optString("name")));
              data.setStatusCount(jsonobject.optString("data"));
              data.setStaus_id(jsonobject.optString("sid"));

              statusList.add(data);
           }
             mainleadRecycler_Adpter.addItems(statusList);
             progressBar.dismiss();
            } catch (JSONException e) {
                 progressBar.dismiss();
                 Toast.makeText(MainActivity.this,"Server Not Responding..Please Try Again",Toast.LENGTH_SHORT).show();
                 Log.e("catchException",e.toString());
                 e.printStackTrace();
              }
            }
         else {
               progressBar.dismiss();
               Toast.makeText(MainActivity.this,"Server Not Responding",Toast.LENGTH_SHORT).show();
               Log.e("error","Empty Response");
              }
          }

【讨论】:

    【解决方案3】:
    1. 删除StringRequest块中的statusList =new ArrayList&lt;Main_lead_data&gt;();行。

    2. StringRequest 块中的progressBar.dismiss(); 之前添加mainleadRecycler_Adpter.notifyDataSetChanged() 行。

    【讨论】:

    • 与@faysal Ahmed 导演的相同
    • 这样有效吗?我没有看到选定的答案。而且不一样。我没有 addAll 功能。 @ShafinRaza
    • 是的,但上述更改是相同的......顺便说一句,它仍然无法正常工作。
    • 将断点设置为statusList.add(data); 并检查数据对象及其值不为空@ShafinRaza
    【解决方案4】:

    你可以使用 jsonschema2pojo 从 JSON 或 JSON-Schema 生成普通的旧 Java 对象。 http://www.jsonschema2pojo.org/

    实现 'com.google.code.gson:gson:2.6.2' 注释库@SerializedName

    Gson gson = new Gson();

    Mainleaddata mainleaddata= gson.fromJson(response.toString(),Mainleaddata.class);

    【讨论】:

      【解决方案5】:

      我不知道问题出在哪里,我刚刚创建了一个新项目,只是为了测试它并对其进行一些小的更改。调试状态列表时出现相同的错误,但我得到了输出。

      下面是MAinactivity的代码:

      public class MainActivity extends AppCompatActivity {
          private RecyclerView mainleadRecycler;
          private Main_lead_Adpater mainleadRecycler_Adpter;
          private ArrayList<Main_lead_data> statusList;
      
          String leadstatus_url;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              leadstatus_url="http://xyz";
                 statusList=new ArrayList<>();
      
              mainleadRecycler = findViewById(R.id.idRecyclerViewHorizontalList);
              mainleadRecycler.addItemDecoration(new DividerItemDecoration(MainActivity.this, LinearLayoutManager.HORIZONTAL));
              mainleadRecycler_Adpter = new Main_lead_Adpater(this,statusList);
              LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
              mainleadRecycler.setLayoutManager(horizontalLayoutManager);
              mainleadRecycler.setAdapter(mainleadRecycler_Adpter);
              getLeadStatus();
          }
      
      
          public void getLeadStatus(){
      
              final ProgressDialog progressBar = new ProgressDialog(MainActivity.this);
              progressBar.setMessage("Loading..");
              progressBar.show();
              RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
              StringRequest stringRequest = new StringRequest(Request.Method.POST,leadstatus_url,
                      new com.android.volley.Response.Listener<String>() {
                          @Override
                          public void onResponse(String response) {
                              if(!response.isEmpty()){
                                  try {
                                      JSONArray jsonarray=new JSONArray(response);
      
                                      for(int i=0;i<jsonarray.length();i++)
                                      {
                                          JSONObject jsonobject = jsonarray.getJSONObject(i);
                                          Main_lead_data data=new Main_lead_data();
                                          data.setStatusName((jsonobject.optString("name")));
                                          data.setStatusCount(jsonobject.optString("data"));
                                          data.setStaus_id(jsonobject.optString("sid"));
      
                                          statusList.add(data);
                                      }
      
                                      progressBar.dismiss();
                                      progressBar.dismiss();
                                  } catch (JSONException e) {
                                      progressBar.dismiss();
                                      Toast.makeText(MainActivity.this,"Server Not Responding..Please Try Again",Toast.LENGTH_SHORT).show();
                                      Log.e("catchException",e.toString());
                                      e.printStackTrace();
                                  }
                              }
                              else {
                                  progressBar.dismiss();
                                  Toast.makeText(MainActivity.this,"Server Not Responding",Toast.LENGTH_SHORT).show();
                                  Log.e("error","Empty Response");
                              }
                          }
                      },
                      new com.android.volley.Response.ErrorListener() {
                          @Override
                          public void onErrorResponse(VolleyError error) {
                              Log.e("error",error.toString());
                              progressBar.dismiss();
                              Toast.makeText(MainActivity.this,"Server Not Responding",Toast.LENGTH_SHORT).show();
                          }
                      }) {
                  @Override
                  protected Map<String, String> getParams() {
                      Map<String, String> params = new HashMap<String, String>();
                      params.put("company_id","2" );
      
                      return params;
                  }
              };
      
              requestQueue.add(stringRequest);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 2013-08-05
        • 2015-07-03
        • 1970-01-01
        • 2017-03-10
        • 2015-12-23
        相关资源
        最近更新 更多