使用 Spinner 使用来自 MySQL 的项目填充 Android ListView

Populate Android ListView with items from MySQL using Spinner

我是一个Android编程新手,标题中的问题一直困扰着我
我在本地主机的 MySQL 数据库中有一个 Groceries table:

id----name---------type
1     apple        fruit
2     banana       fruit
3     lettuce      vegetable
4     apricot      fruit
5     cauliflower  vegetable

我的 Android 应用程序中还有一个 Spinner 和一个 ListView。 Spinner 有一个字符串数组的条目,其中包含 fruit & vegetable.
我希望当用户从微调器中选择 fruitvegetable 类型时,ListView 将填充 MySQL.

中相应类型的名称

这是我到目前为止所做的。

MainActivity class:

package com.example.mine.application;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

public Spinner groceryTypes;
public ListView groceries;

public static List<String> arrayGroceries;
ArrayAdapter<String> adapterGroceries;

@Override
protected void onCreate(Bundle savedInstanceState) {

    groceryTypes = (Spinner) findViewById(R.id.groceryTypes_spinner);
    groceries = (ListView) findViewById(R.id.groceries_listView);

    arrayGroceries = new ArrayList<>();
    adapterGroceries = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayGroceries);
    groceries.setAdapter(adapterGroceries);

    groceryTypes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            BackgroundWorker backgroundWorker = new BackgroundWorker(MainActivity.this);
            backgroundWorker.execute(groceryTypes.getItemAtPosition(position).toString());
            adapterGroceries.notifyDataSetChanged();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            //TODO Auto-generated method stub
        }
    });
}

BackgroundWorker class:

package com.example.mine.application;
import android.content.Context;
import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class BackgroundWorker extends AsyncTask<String, Void, String> {
Context context;

BackgroundWorker(Context ctx){
    context = ctx;
}

@Override
protected String doInBackground(String... params) {
    String groceries_URL = "http://10.0.2.2/groceries.php";
    String groceryType = params[0];
    try {
        URL url = new URL(groceries_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setDoInput(true);

        OutputStream outputStream = httpURLConnection.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter
                (new OutputStreamWriter(outputStream, "UTF-8"));
        String post_data = URLEncoder.encode("grocery_type", "UTF-8")+"="+URLEncoder.encode(groceryType, "UTF-8");
        bufferedWriter.write(post_data);
        bufferedWriter.flush();
        bufferedWriter.close();
        outputStream.close();

        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader
                (new InputStreamReader(inputStream, "iso-8859-1"));

        MainActivity.arrayGroceries.clear();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            MainActivity.arrayGroceries.add(line);
        }
        bufferedReader.close();
        inputStream.close();
        httpURLConnection.disconnect();

        return null;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
}

这是我的 groceries.php:

<?php
require "conn.php";

$grocery_type = $_POST["grocery_type"];
$qry = "SELECT name FROM groceries WHERE type LIKE '$grocery_type';";

$result = mysqli_query($conn, $qry);

while($row = mysqli_fetch_row($result)) {
    echo $row[1];
}

mysqli_free_result($result);

$conn->close();
?>

我认为问题在于我如何处理查询中的多个项目,但任何解释和帮助实现这一点都将受到高度重视。

假设您从服务器获取了正确的数据并且正在填充杂货数组,您需要将 onPostExecute 添加到 BackgroundWorker AsyncTask 并通知 adapterGroceries 数据已经改变。

您在 AysncTask.execute() 之后执行此操作,但它在那里没有任何好处,execute() returns 立即和通知 运行s 但有还没有更新。数据returns.

后需要运行