使用 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
.
我希望当用户从微调器中选择 fruit
或 vegetable
类型时,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.
后需要运行
我是一个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
.
我希望当用户从微调器中选择 fruit
或 vegetable
类型时,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.