【问题标题】:passing one param to server and get array using JsonArrayRequest with volley android studio将一个参数传递给服务器并使用 JsonArrayRequest 和 volley android studio 获取数组
【发布时间】:2017-03-16 14:28:04
【问题描述】:

我正在尝试制作一个应用程序。我努力在我的数据库中获取我的一张表的一些数据。我知道如何从我的表中获取所有内容,但现在我只需要这张表的几行。所以我必须通过一个 ID 。 问题是我无法在JsonArrayRequest 中添加任何参数。 你可以看到我的 php 文件和我正在调用的类 JsonArrayRequest:

php

<?php
include 'dbconfig.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
$user_id = $_POST["user_id"]; // this is what Im trying to fix 
$sql = "SELECT * FROM plans WHERE user_id=?"; // and pass the information in ?
$result = $conn->query($sql);

if ($result->num_rows >0) {
// output data of each row
    while($row[] = $result->fetch_assoc()) {
        $tem = $row;
        $json = json_encode($tem);
    }
} else {
    echo "0 results";
}
echo $json;
$conn->close();
?>

java 类:

public class PlansActivity extends AppCompatActivity {


    List<GetDataAdapter> GetDataAdapter1;

    RecyclerView recyclerView;

    RecyclerView.LayoutManager recyclerViewlayoutManager;

    RecyclerView.Adapter recyclerViewadapter;

    ProgressBar progressBar;

    String GET_JSON_DATA_HTTP_URL = "http://travelb.000webhostapp.com/jsonData.php";
    String JSON_ID = "user_id";
    String JSON_NAME = "destination";
    String JSON_SUBJECT = "date";
    String JSON_PHONE_NUMBER = "plan_id";

    Button button;

    PostJsonArrayRequest jsonArrayRequest ;


    RequestQueue requestQueue ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_plans);

        GetDataAdapter1 = new ArrayList<>();

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);

        progressBar = (ProgressBar) findViewById(R.id.progressBar1);

        button = (Button)findViewById(R.id.button) ;

        recyclerView.setHasFixedSize(true);

        recyclerViewlayoutManager = new LinearLayoutManager(this);

        recyclerView.setLayoutManager(recyclerViewlayoutManager);

        final Intent intent = getIntent();

        final int id = intent.getIntExtra("user_id", -1);




      /*  button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                progressBar.setVisibility(View.VISIBLE);

                JSON_DATA_WEB_CALL();

            }
        });*/
        JSON_DATA_WEB_CALL();

    }

    public void JSON_DATA_WEB_CALL(){

      JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(GET_JSON_DATA_HTTP_URL,

                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        progressBar.setVisibility(View.GONE);


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

                    }
                });

        requestQueue = Volley.newRequestQueue(this);

        requestQueue.add(jsonArrayRequest);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array){

        for(int i = 0; i<array.length(); i++) {

            GetDataAdapter GetDataAdapter2 = new GetDataAdapter();

            JSONObject json = null;
            try {
                json = array.getJSONObject(i);

                GetDataAdapter2.setId(json.getInt(JSON_ID));

                GetDataAdapter2.setName(json.getString(JSON_NAME));

                GetDataAdapter2.setSubject(json.getString(JSON_SUBJECT));

                GetDataAdapter2.setPhone_number(json.getString(JSON_PHONE_NUMBER));

            } catch (JSONException e) {

                e.printStackTrace();
            }
            GetDataAdapter1.add(GetDataAdapter2);
        }

        recyclerViewadapter = new RecyclerViewAdapter(GetDataAdapter1, this);

        recyclerView.setAdapter(recyclerViewadapter);
    }
}

我读了很多东西,但都不同。我是 androidstudio 和 php 的新手。 我希望有人可以帮助我,因为我已经尝试这样做了 2 周。

【问题讨论】:

    标签: java php android json android-volley


    【解决方案1】:

    您应该像这样在自定义请求中扩展 JsonArrayRequest:

    public class MyJsonArrayRequest extends JsonArrayRequest {
    
        private Map<String, String> mPostParams;
    
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return mPostParams;
        }
    
        public MyJsonArrayRequest(String url, Map<String, String> postParams, Response.Listener<JSONArray> listener, Response.ErrorListener errorListener) {
            super(url, listener, errorListener);
    
            this.mPostParams = postParams; 
        }
    }
    

    使用getParams() 方法,您将能够传递 POST 参数。

    Map<String, String> params = new HashMap<>();
    params.put("ID", id);
    params.put("USER_ID", userId);
    MyJsonArrayRequest jsonArrayRequest = new MyJsonArrayRequest(GET_JSON_DATA_HTTP_URL, params,
    
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
    
                progressBar.setVisibility(View.GONE);
    
    
                JSON_PARSE_DATA_AFTER_WEBCALL(response);
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
    
            }
        });
    

    另一种方法是通过 GET 请求在 URL 中传递参数。

    【讨论】:

    • 那么我应该在这部分的哪里添加一个变量:
    • 在 getParams() 方法中,您应该返回一个带有键“ID”的 HashMap 并为 int 值赋值。在您的 php api 中,您将能够在 $_POST["ID"] 中读取它
    • 我仍然对这一行感到困惑:params.put("ID",22);因为 22 是用户的 id,对于 app 的每个用户来说都是不同的。我在之前的活动中从数据库中获取了这个变量,并将它存储在一个名为 user_id 的变量中。所以现在我必须从我的活动 userareaactivity 传递这个变量 user_id 并将它传递给我创建的这个类,然后用这个 22 替换它。
    • 我已经更改了代码:现在您可以在构造函数中传递帖子参数了。
    【解决方案2】:

    您可以通过覆盖 getParam 方法来使用 jsonArrayRequest 发送参数

    JsonArrayRequest request = new JsonArrayRequest(method, url, null, responseListener, errorListener) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> params = new HashMap<>();
                try {
    
                    params.put("paramOne", "hello");
    
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return params;
            }
        };
        addToRequestQueue(request);
    

    【讨论】:

    • 你是怎么做到的。你明白我的问题了吗?
    • 如果我没记错的话,你说你不能在 jsonarray 请求中添加任何参数(发送请求时你想随请求发送一些信息)?
    【解决方案3】:

    @mcatta

    我想做一些我在其他活动中所做的事情:

    ProfileRequest profilRequest = new ProfileRequest(id, responseListener);
                    RequestQueue queue = Volley.newRequestQueue(UserAreaActivity.this);
                    queue.add(profilRequest);
    

        public class ProfileRequest extends StringRequest {
    
            private static final String PROFIL_REQUEST_URL = "http://travelb.000webhostapp.com/Profil.php ";
            private Map<String, String> params;
    
            public ProfileRequest(int user_id, Response.Listener<String> listener){
                super(Request.Method.POST, PROFIL_REQUEST_URL, listener, null);
                params= new HashMap<>();
                params.put("user_id", user_id+"");
            }
    
        @Override
        public Map<String, String> getParams() {
            return params;
        }
    }
    

    所以 profilerequest 中的 id 是一个最终的 int 变量。 这很容易做到。 我仍然对 jsonarrayrequest 感到困惑

    【讨论】:

      【解决方案4】:

      已经很久了,但是, 有人会发现它有用 以下代码有效。

      public class Activity extends AppCompatActivity {
      
        List<GetDataAdapter> GetDataAdapter1;
        RecyclerView recyclerView;
        RecyclerView.LayoutManager recyclerViewlayoutManager;
        RecyclerView.Adapter recyclerViewadapter;
        ProgressBar progressBar;
        String GET_JSON_DATA_HTTP_URL = "API here";
        //String JSON_ID = "id";
        //we have intilize here with json names and database column name also should be kept here
        String JSON_FNAME = "contact_fname";
        String JSON_LNAME = "contact_lname";
      
        RequestQueue requestQueue ;
      
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_booking);
            GetDataAdapter1 = new ArrayList<>();
            recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);
            progressBar = (ProgressBar) findViewById(R.id.progressBar1);
            recyclerView.setHasFixedSize(true);
            recyclerViewlayoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(recyclerViewlayoutManager);
            //json web call from web
            JSON_DATA_WEB_CALL();
        }
      
        public void JSON_DATA_WEB_CALL(){
            String uid ="value"//Or you can use your value to pass
      
            StringRequest strrequest = new StringRequest(Request.Method.POST,GET_JSON_DATA_HTTP_URL,
      
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
      
                            progressBar.setVisibility(View.GONE);
                            try {
                                JSON_PARSE_DATA_AFTER_WEBCALL(response);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
      
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
      
                        }
                    }){
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> params = new HashMap<>();
                    params.put("userid", uid);//userid to send to php
                    return params;
                }
            };
      
            requestQueue = Volley.newRequestQueue(this);
      
            requestQueue.add(strrequest);
        }
      
        public void JSON_PARSE_DATA_AFTER_WEBCALL(String array) throws JSONException {
      
            JSONArray jarr = new JSONArray(array);
            for(int i = 0; i<jarr.length(); i++) {
                GetDataAdapter GetDataAdapter2 = new GetDataAdapter();//adapter class
                //JSONObject json;
                try {
                    JSONObject json = jarr.getJSONObject(i);
                   // JSONObject json = (JSONObject) array.get(String.valueOf(i));
      
                    //set and get methods should declare here with database colmun names and json names
                    GetDataAdapter2.setcontact_fname(json.getString(JSON_FNAME));
                    GetDataAdapter2.setcontact_lname(json.getString(JSON_LNAME));
      
                } catch (JSONException e) {
      
                    e.printStackTrace();
                }
                GetDataAdapter1.add(GetDataAdapter2);
      
            }
      
            recyclerViewadapter = new RecyclerViewAdapter(GetDataAdapter1, this);
            recyclerView.setAdapter(recyclerViewadapter);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        相关资源
        最近更新 更多