【问题标题】:create Spinner with a JSON Array使用 JSON 数组创建 Spinner
【发布时间】:2018-01-27 16:33:47
【问题描述】:

我想在微调器中显示我从互联网上下载的 JSON 数组作为项目。所以我为它创建了一个Activity(SearchActivity)。首先,我的 JSON 是这样的:

[ { "Category": "B, A" }, { "Category": "C, B" }, { "Category": "A" }, { "Category": "A, B" }, { "Category": "B" }, { "Category": "C" }, { "Category": "A,C" } ]

这是此 PHP 代码的结果:

    <?php
    require_once 'include\config.php';
    // connect to database
    $con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);

    // Check connection
    if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $content = mysqli_query($con,"SELECT DISTINCT  `Category` FROM `civilarticle` ");

    $output = array();
while($row = mysqli_fetch_array($content)){
     $record = array();
     $record['Category'] = $row['Category'];
     $output[] = $record;
}
    echo json_encode($output);


    //closing connection 
     mysqli_close($con);
?>

这是我的活动:

public class SearchActivity extends Activity {
Spinner spinner;
ArrayList<String> Category;
String url="http://192.168.1.103/android_login_api/search.php";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    Category=new ArrayList<String>();
    spinner=(Spinner)findViewById(R.id.spinner);
    loadSpinnerData(url);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            String category=   spinner.getItemAtPosition(spinner.getSelectedItemPosition()).toString();
            Toast.makeText(getApplicationContext(),category,Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
            // DO Nothing here
        }
    });

}

private void loadSpinnerData(String url) {
    RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
    StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            try {
                JSONArray jsonarray = new JSONArray(response);
                for (int i = 0; i < jsonarray.length(); i++) {
                    JSONObject jsonobject = jsonarray.getJSONObject(i);
                    String Category = jsonobject.getString("Category");
                }
                spinner.setAdapter(new ArrayAdapter<String>(SearchActivity.this, android.R.layout.simple_spinner_dropdown_item, Category));
                //Toast.makeText(SearchActivity.this,response,Toast.LENGTH_SHORT).show();
            }
            catch (JSONException e){e.printStackTrace();}
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    int socketTimeout = 30000;
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    stringRequest.setRetryPolicy(policy);
    requestQueue.add(stringRequest);
}

}

这是我的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="15dp"
    android:orientation="vertical"
    tools:context="info.androidhive.customlistviewvolley.SearchActivity">



    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

但是当我运行程序时。 Spinner 上没有任何物品。为什么?

【问题讨论】:

    标签: php android json android-studio android-volley


    【解决方案1】:

    您需要将收到的项目从响应添加到列表中

    for (int i = 0; i < jsonarray.length(); i++) {
        JSONObject jsonobject = jsonarray.getJSONObject(i);
        Category.add(jsonobject.getString("Category"));
    }
    

    目前,您只是在一个局部变量中获取值,而没有在任何地方使用

    【讨论】:

      【解决方案2】:

      ArrayAdapter 默认接受 ArrayList

      ArrayAdapter(上下文上下文、int 资源、列表对象)
      ArrayAdapter(Context context, int resource, T[] objects)

      所以你需要在一个列表中解析你的JSON 数据,然后将它传递给适配器。

       try {
              ArrayList<String> catList=new ArrayList<>();
              JSONArray jsonarray = new JSONArray(response);
              for (int i = 0; i < jsonarray.length(); i++) {
                  JSONObject jsonobject = jsonarray.getJSONObject(i);
                  catList.add(jsonobject.getString("Category"));
              }
              spinner.setAdapter(new ArrayAdapter<String>(SearchActivity.this,
                      android.R.layout.simple_spinner_dropdown_item, catList));
          }catch (Exception e){
              e.printStackTrace();
          }
      

      【讨论】:

      • 非常感谢,感谢您的帮助
      • OP 已经有了它ArrayList&lt;String&gt; Category 所以不需要创建一个新的本地列表
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多