Recyclerview android 带有 post 参数的 volley JsonArrayRequest

Recyclerview android with volley JsonArrayRequest with post parameters

我想用 JSON 数组加载我的 recyclerview。我为此使用截击。

我目前正在使用 StringRequest

我想要 post 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 参数并获得响应。

下面是适配器class:

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

谢谢。

在获取 arraylist 和设置适配器后尝试使用调用适配器的构造函数 thereafter.That 将工作

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

将此方法添加到适配器

 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");
              }
          }
  1. 删除 StringRequest 块中的 statusList =new ArrayList<Main_lead_data>(); 行。

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

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

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

Gson gson = new Gson();

主要数据 mainleaddata= gson.fromJson(response.toString(),Mainleaddata.class);

我不知道出了什么问题,我刚刚创建了一个新项目只是为了测试这个和它与一些小问题一起工作 changes.While 调试状态列表给出了同样的错误,但我得到了输出。

下面是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);
    }
}