kmil
kmil

Reputation: 243

Populating JSON from SQL to Android Listview

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

Answers (1)

AL.
AL.

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

Related Questions