为此,我想使用PHP从phpmyadmin中提取数据来填充我的ListView。 与Populating JSON from this link to android Listview
非常相似有人能指出我正确的方向吗?整个周末都有这个问题。
社会搜索课
public class SocietySearch extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_society_search);
Society society = new Society(-1, null, null, null);
ServerRequests serverRequest1 = new ServerRequests(SocietySearch.this);
serverRequest1.GetSocietyDataAsyncTask(society, new GetSocietyCallback() {
@Override
public void done(final Society returnedSociety) {
// ServerRequests.rowCount; // TODO this produces an error getrowcount
ListView lv = (ListView) findViewById(R.id.ListView);
List<ListViewItem> items = new ArrayList<>();
for (int i=0; i <10; i++){
items.add(new ListViewItem() {{
ThumbnailResource = R.drawable.test;
Title = returnedSociety.socName;
Subtitle = returnedSociety.socDes;
}});
CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items);
lv.setAdapter(adapter);}
}
});
}
class ListViewItem {
public int ThumbnailResource;
public String Title;
public String Subtitle;
}
}
CustomListViewAdapter类:
public class CustomListViewAdapter extends BaseAdapter {
LayoutInflater inflater;
List<SocietySearch.ListViewItem> items;
public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items) {
super();
this.items = items;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
//Auto-generated method stub
return items.size(); // TODO Maybe this can be my sql count?
}
@Override
public Object getItem(int position) {
//Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
//Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Auto-generated method stub
ListViewItem item = items.get(position);
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.item_row, null);
ImageView test = (ImageView) vi.findViewById(R.id.imgThumbnail);
TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle);
TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle);
test.setImageResource(item.ThumbnailResource);
txtTitle.setText(item.Title);
txtSubTitle.setText(item.Subtitle);
return vi;
}
}
ServerRequests类的相关部分:
public class ServerRequests {
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 1000 * 15;
public static final String SERVER_ADDRESS = "http://10.0.2.2:80/";//Connects to the emulator
public ServerRequests(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing");
progressDialog.setMessage("Please wait...");
}
public void GetSocietyDataAsyncTask(Society society, GetSocietyCallback societyCallBack) {
progressDialog.show();
new getSocietyDataAsyncTask(society, societyCallBack).execute();
}
public class getSocietyDataAsyncTask extends AsyncTask<Void, Void, Society> {
Society society;
GetSocietyCallback societyCallback;
public getSocietyDataAsyncTask(Society society, GetSocietyCallback societyCallback) {
this.society = society;
this.societyCallback = societyCallback;
}
@Override
protected Society doInBackground(Void... params) {
BufferedReader reader = null;
Society returnedSociety = null;
try {
URL url = new URL(SERVER_ADDRESS + "/getsocietydata.php");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(CONNECTION_TIMEOUT);
con.setReadTimeout(CONNECTION_TIMEOUT);
con.setRequestMethod("POST");
con.setDoOutput(true);
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line = reader.readLine()) != null) { //Read until there is something available
sb.append(line + "\n"); //Read and save line by line
}
line = sb.toString(); //Saving complete data received in string
//Check values received in Logcat
Log.i("custom_check", "The values received in the store part are as follows:");
Log.i("custom_check", line);
JSONObject jObject = new JSONObject(line);
if (jObject.length() == 0) {
returnedSociety = null;
} else {
//Storing each Json in a variable
int society_id = jObject.getInt("society_id");
String socName = jObject.getString("name");
String socEmail = jObject.getString("email");
String socDes = jObject.getString("description");
returnedSociety = new Society(society_id, socName, socEmail, socDes);
System.out.println(returnedSociety);
return returnedSociety;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("Buffer Error", "Error converting result " + e.toString());
}
finally {
if (reader != null) {
try {
reader.close(); //Closing the
} catch (IOException e) {
e.printStackTrace();
}
}
}
return returnedSociety;
}
@Override
protected void onPostExecute(Society returnedSociety) {
super.onPostExecute(returnedSociety);
progressDialog.dismiss();
societyCallback.done(returnedSociety);
}
}
对象保存数据:
public class Society {
String socName, socEmail, socDes;
int society_id;
public Society(int society_id, String socName, String socEmail, String socDes) {
this.society_id = society_id;
this.socName = socName;
this.socEmail = socEmail;
this.socDes = socDes;
}
public int getSociety_id(){
return this.society_id;
}
public String getSocName(){
return this.socName;
}
public String getSocEmail(){
return this.socEmail;
}
public String getSocDes(){
return this.socDes;
}
}
item_row.xml(ListView的XML)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dip">
<ImageView
android:id="@+id/imgThumbnail"
android:layout_width="78dip"
android:layout_height="78dip"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:layout_marginLeft="-3dip"
android:scaleType="centerInside"></ImageView>
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dip"
android:layout_marginTop="6dip"
android:layout_toRightOf="@+id/imgThumbnail"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
<TextView
android:id="@+id/txtSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtTitle"
android:layout_marginLeft="6dip"
android:layout_marginTop="3dip"
android:layout_toRightOf="@+id/imgThumbnail"
android:text="TextView"></TextView>
</RelativeLayout>
GetSocietyData PHP代码:
<?php
$user = 'root';
$pass = '';
$db = 'uopuser';
$con=mysqli_connect('localhost', $user, $pass, $db) or die('Unable to connect');
$statement = mysqli_prepare($con, 'SELECT * FROM society');
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $society_id, $name, $email, $description);
$society = array();
$key = 0;
while(mysqli_stmt_fetch($statement))
{
$society[$key]['society_id'] = $society_id;
$society[$key]['name'] = $name;
$society[$key]['email'] = $email;
$society[$key]['description'] = $description;
$key++;
}
echo json_encode($society);
mysqli_stmt_close($statement);
mysqli_close($con);
?>
答案 0 :(得分:1)
因此,根据与kmil的讨论,我们发现有两个主要问题。首先是代码的一部分,这个循环是:
ListView lv = (ListView) findViewById(R.id.ListView);
List<ListViewItem> items = new ArrayList<>();
for (int i=0; i <10; i++){
items.add(new ListViewItem() {{
ThumbnailResource = R.drawable.test;
Title = returnedSociety.socName;
Subtitle = returnedSociety.socDes;
}});
CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items);
lv.setAdapter(adapter);}
}
看到listview适配器不断重置 - 新的CustomListViewAdapter(...) 它被移动到for循环之外,只有在循环之后才被调用所有数据。其次是解析从数据库收到的数据,该数据是 JSONArray 。成功解析后,一切顺利。 :d