Reputation: 243
For this I would like to populate my ListView with data pulled from phpmyadmin using PHP. Very similar to Populating JSON from this link to android Listview
Could somebody point me in the right direction please? had this problem all weekend.
SocietySearch Class
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 Class:
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;
}
}
Relevant Part of ServerRequests Class:
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);
}
}
Object Holding Data:
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 (XML for ListView)
<?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 code:
<?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);
?>
Upvotes: 1
Views: 87
Reputation: 37778
So as per discussion with kmil, we sorted out that there was two main concerns. First was the part of the code where this loop was:
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);}
}
Seeing as the listview adapter keeps getting reset -- new CustomListViewAdapter(...) it was moved outside of the for loop and was only called only after looping through all the data. Second was the parsing of the data that was received from the database which was a JSONArray. After successfully parsing, all worked out well. :D
Upvotes: 1