2017-03-16 22 views
0

我試圖做一個應用程序。我努力在我的數據庫中獲取我的表中的一個數據。我知道如何從我的桌子上得到一切,但現在我只需要這張桌子的幾行。所以我必須通過一個ID。 問題是我不能添加任何參數在JsonArrayRequest。 你可以看到我的PHP文件和我的課堂,我打電話JsonArrayRequest傳遞一個參數到服務器,並獲取數組使用JsonArrayRequest與凌空android studio

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周。

回答

0

您應該延長JsonArrayRequest在您自定義的請求這樣與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) { 

     } 
    }); 

另一種方法是通過URL中的GET請求傳遞參數。

+0

好的,所以我創建了這個帶有擴展名的新類。 –

+0

那麼那麼我應該在這部分添加變量: –

+0

在getParams()方法中,您應該返回一個帶有「ID」鍵的HashMap並賦值int值。 在你的php api中,你將能夠在$ _POST [「ID」]中讀取它 – mcatta

0

您可以通過重寫getParam方法

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); 
+0

你是如何做到這一點的。你明白我的問題嗎? –

+0

你說你不能在jsonarray請求中添加任何參數(當發送請求時你想發送一些與請求有關的信息)如果我沒有弄錯的話? –

+0

是的,但我的代碼是不同的 –

0

@mcatta

我想要做的事就像我在其他acticity做:

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

0

它已經很長一段時間,但是, 有人可以發現它有用 和下面的代碼的作品。

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); 
    } 
} 
相關問題