2016-05-23 47 views
0

我只是想在我的android應用程序中製作一個簡單的微調框。 當我嘗試在微調器中設置項目,但列表中沒有顯示任何項目。從MySQL數據庫填充Android微調 - 列表中沒有項目顯示

我的PHP文件:

[{"id_matkul":"1","kode_matkul":"fffffafafafa","nama_matkul":"adas333","dosen1_matkul":"dddada333","dosen2_matkul":"asdasda"},{"id_matkul":"3","kode_matkul":"asasaaaaa44","nama_matkul":"asas","dosen1_matkul":"asas444","dosen2_matkul":"asa33"}] 

我的活動代碼:

package com.qalbistudio.kartukontrolapp; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 

import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.List; 

    public class DaftarNilaiUtama1 extends AppCompatActivity { 

     Spinner sp; 
     TextView textView; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_daftar_nilai_utama1); 

      sp = (Spinner) findViewById(R.id.spinner); 


      Response.Listener<String> responseListener = new Response.Listener<String>() { 


      @Override 
      public void onResponse(String response) { 
       try { 


        JSONObject jsonResponse = new JSONObject(response); 
        JSONArray jsonMainNode = jsonResponse.optJSONArray("response"); 

        List<String> item = new ArrayList<String>(); 

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

          JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
          String nama1 = jsonChildNode.optString("id_matkul"); 

          item.add(nama1); 

          ArrayAdapter<String> adapter = new ArrayAdapter<String>(DaftarNilaiUtama1.this,android.R.layout.simple_spinner_dropdown_item, item); 

          adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

          sp.setAdapter(adapter); 
         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
     }; 

     SpRequest spreq = new SpRequest(responseListener); 
     RequestQueue queue = Volley.newRequestQueue(DaftarNilaiUtama1.this); 
     queue.add(spreq); 
    } 
} 

我的服務器請求代碼:

<?php 
$con = mysqli_connect("xxxx","xxxx","xxxx","xxxx"); 
$sql = "select * from mata_kuliah"; 
$result = mysqli_query($con, $sql) or die("Error in Selecting " . mysqli_error($con)); 

//create an array 
$response = array(); 
while($row =mysqli_fetch_assoc($result)) 
{ 
    $response[] = $row; 
} 

echo json_encode($response); 
?> 

它以這種形式返回一個JSON字符串

import com.android.volley.Response; 
import com.android.volley.toolbox.StringRequest; 

import java.util.Map; 

/** 
* Created by callbee on 20/05/2016. 
*/ 
public class SpRequest extends StringRequest { 
    private static final String URL = "http://192.168.1.10/KartuKontrolApp/testing.php"; 
    private Map<String, String> params; 

    public SpRequest(Response.Listener<String> listener) { 
     super(Method.POST, URL, listener, null); 
    } 

    public Map<String, String> getParams() { 
     return params; 
    } 
} 
+0

我對php不太熟悉,但看起來響應只會是一行 –

+0

@ cricket_007:不,它不僅顯示一行。它顯示我需要的所有我的PHP文件。我編輯了我的文章並添加了我的PHP文件的結果。 – ainunqalbi06

+0

如果您的應用程序正在有效接收有效的JSON對象,您是否驗證過?你想看到針對同一問題的不同方法嗎? –

回答

1

請勿在for循環內創建適配器併爲微調器設置適配器。
您適配器將創建多個時間從外部服務器

... 
List<String> item = new ArrayList<String>(); 
for (int i = 0; i < jsonMainNode.length(); i++) { 
    JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
    String nama1 = jsonChildNode.optString("id_matkul"); 

    item.add(nama1); 
} 
ArrayAdapter <String> adapter = new ArrayAdapter <String> (DaftarNilaiUtama1.this, android.R.layout.simple_spinner_dropdown_item, item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
sp.setAdapter(adapter); 
+0

我試過這個,沒有變化,但我認爲這也是我的一個程序錯誤.. :) – ainunqalbi06

1

更新必須從Thread內進行(其完成時間可能需要年齡[處理時間]任務),像這樣:

private boolean updateWorkingData() { 
    boolean flagOK = false; 
    Thread thisThread = null; 
    try { 
     thisThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       Log.w(TAG,"inside JSON thread"); 
       String urlRest = "http://192.168.1.10/KartuKontrolApp/testing.php"; // TODO 20160523 create a PROPER restful call, verify format 
       JSONArray jsonArray = new DbConnectJson().getJSONfromURL(urlRest); 
       JSONObject jsonObject = new JSONObject(); 
       String[][] stringTemp = new String[jsonArray.length()][3]; 
       try { 
        for (int i=0;i<jsonArray.length();i++) { 
         jsonObject = jsonArray.getJSONObject(i); 
         stringTemp[i][0] = jsonObject.getString("id_matkul"); 
         stringTemp[i][1] = jsonObject.getString("kode_matkul"); 
         stringTemp[i][2] = jsonObject.getString("nama_matkul"); // etc 
         Log.d(TAG,"id:["+stringTemp[i][0]+"] kode:["+stringTemp[i][1]+"] nama_matkul:["+stringTemp[i][2]+"]"); 
        } 
        // TODO 20160523 populate spinner from string array 

       } catch (JSONException e) { 
        Log.e(TAG,"CRASHED JSONOBJECT matkul update"); 
        e.printStackTrace(); 
       } 
      } 
     }); 
     thisThread.start(); 
     flagOK = true; // means that the thread was CALLED without CRASH 
    } catch (Exception e) { 
     Log.e(TAG,"CRASHED JSONOBJECT Thread"); 
     e.printStackTrace(); 
    } 
    return flagOK; 
} 

當您調用此線程時,您必須具有後續協議來驗證它是否正常工作並且數據已更新。

我會進一步建議你將你的微調數據保存到SQLite適配器(想到一個MySQL表),它將永久存儲在安全的地方(它保存在應用程序的沙箱中,無法從外部應用程序訪問 - 而不是如果將數據保存到設備上的TXT文件會發生什麼情況)。

因此,用戶不必絕對必須在線每次他/她啓動應用程序。

當應用程序加載時,您檢查適配器中是否有數據並使用該數據,同時檢查服務器上的RESTful php(作爲背景測試)並確定是否有可用更新。如果且僅當您的應用程序確認需要更新應用程序纔會再次觸發更新線程。

+0

in'DbConnectJson()'我不知道應該換成什麼? – ainunqalbi06

+1

我已經解決了這個問題。謝謝你,因爲你的代碼,我可以找出我的代碼中的錯誤。我不知道如何解釋它,但代碼被交換了,那'JSONArray'應該與'Response.Listener'而不是'JSONObject'連接,像這樣: 'JSONArray jsonMainNode = new JSONArray(response); JSONObject jsonResponse = new JSONObject(); ' – ainunqalbi06

相關問題