Adv

Android MySQL ListView

This piece examines the following concepts:

  1. PHP MySQL Database
  2. ListView

Feel free to add more examples.

Share

Related Concepts

Adv

3 Examples

  1. Android MySQL – Select Multiple Columns and Fill Custom ListView

    Android MySQL – Select Multiple Columns and Fill Custom ListView Tutorial

    How to select multiple columns from mysql database and populate a custom listview with multiple textviews.

    Overview

    Welcome. In this class we are going to look at MySQL database. How to connect to MySQL, retrieve multiple columns and rows from a given database table and bind them to a custom ListView.

    That ListView will have several fields, each representing a given record column from our mysql database table.

    These fields will include:

    • ID.
    • Name.
    • Propellant.
    • Description.

    Our application will have the following classes:

    No. Class Description
    1. Spacecraft.java Will represent our data object. We will be selecting spacecrafts from our mysql database.
    2. CustomAdapter.java This is the adapter needed to adapt our data to our custom listview. It will also inflate the custom layout which will make up the ListView view items.
    3. Connector.java This is the class responsibe for setting up our connection and returning a HttpURLConnection object.
    4. DataParser.java This is the class responsible for parsing our JSON data and returning an ArrayList containing our data.
    5. Downloader.java This is the class responsible for actually downloading our json data in a background thread via AsyncTask. The networking class used for this download is our HttpURLConnection.
    6. MainActivity.java This is our main activity. It represents the overall user interface or screen.

    Tools Used

    These are the tools we used to create the project:

    1. Language : Java.
    2. Platform : Android.
    3. IDE : Android Studio.
    4. OS : Windows 8.1

    Let’s go.

    1. PHP Code

    Here’s our PHP Code to select multiple columns data from our mysql database and return it in json format.
    Am using Wamp: C:wampwwwandroidspacecraft_select.php.

    <?php
    
    $host='127.0.0.1';
    $username='root';
    $pwd='';
    $db="spacecraftDB";
    
    $con=mysqli_connect($host,$username,$pwd,$db) or die('Unable to connect');
    
    if(mysqli_connect_error($con))
    {
        echo "Failed to Connect to Database ".mysqli_connect_error();
    }
    
    $sql="SELECT * FROM spacecraftTB";
    
    $result=mysqli_query($con,$sql);
    if($result)
    {
        while($row=mysqli_fetch_array($result))
        {
            $flag[]=$row;
        }
    
        print(json_encode($flag));
    
    }
    
    mysqli_close($con);
    
    ?>

    2. Setup

    (a). Create Basic Activity Project
    1. First create a new project in android studio. Go to File –> New Project.
    (b). Project Structure

    Here’s our project structure:

    (c). Build.Gradle

    Our app level(app folder) build.gradle.

    AndroidStudio allows us to add our application dependencies right here using compile statements.

    So we add our dependencies here. You may use later versions of the dependencies.

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:26.+'
        compile 'com.android.support:design:26.+'
        compile 'com.android.support:cardview-v7:26.+'
    
    }
    
    (d). AndroidManifest.xml

    We add internet permission here.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest 
        package="com.tutorials.hp.mdmysqlselect">
    
        <uses-permission android_name="android.permission.INTERNET"/>
        ...
    </manifest>

    3. Create User Interface

    User interfaces are typically created in android using XML layouts as opposed to direct java coding.

    Here are our layouts for this project:

    (a). activity_main.xml
    • This layout gets inflated to MainActivity user interface.
    • It includes the content_main.xml.
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 
        
        
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_fitsSystemWindows="true"
        tools_context="com.tutorials.hp.mdmysqlselect.MainActivity">
    
        <android.support.design.widget.AppBarLayout
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android_id="@+id/toolbar"
                android_layout_width="match_parent"
                android_layout_height="?attr/actionBarSize"
                android_background="?attr/colorPrimary"
                app_popupTheme="@style/AppTheme.PopupOverlay" />
    
        </android.support.design.widget.AppBarLayout>
    
        <include layout="@layout/content_main" />
    
        <android.support.design.widget.FloatingActionButton
            android_id="@+id/fab"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="bottom|end"
            android_layout_margin="@dimen/fab_margin"
            android_src="@android:drawable/ic_dialog_email" />
    
    </android.support.design.widget.CoordinatorLayout>
    
    (b). content_main.xml

    This layout gets included in your activity_main.xml.
    We define our UI widgets here.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
        
        
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.mdmysqlselect.MainActivity"
        tools_showIn="@layout/activity_main">
    
        <ListView
            android_id="@+id/lv"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
             />
    </RelativeLayout>
    
    (c). model.xml

    This is our custom row layout. Our model layout.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView 
        android_orientation="horizontal" android_layout_width="match_parent"
        
        android_layout_margin="10dp"
        card_view_cardCornerRadius="5dp"
        card_view_cardElevation="5dp"
    
        android_layout_height="150dp">
    
        <RelativeLayout
            android_layout_width="match_parent"
            android_layout_height="match_parent">
    
            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Name"
                android_id="@+id/nameTxt"
                android_padding="10dp"
                android_textColor="@color/colorAccent"
    
                android_layout_alignParentLeft="true"
                 />
    
            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Description....................."
                android_id="@+id/descTxt"
                android_padding="10dp"
                android_layout_below="@+id/nameTxt"
                android_layout_alignParentLeft="true"
    
                />
    
            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Propellant"
                android_id="@+id/propellantTxt"
                android_textColor="@color/colorPrimary"
                android_padding="10dp"
                android_layout_alignParentRight="true"
                />
    
        </RelativeLayout>
    </android.support.v7.widget.CardView>

    4. Java Code

    (a). Spacecraft.java

    Android is normally written in Java programming language. Java classes are normally organized in packages. This class will have the com.tutorials.hp.mdmysqlselect.mDataObject package.

    This class is a public class and represents a single spacecraft for us.

    The class will have the following instance fields:

    1. Id – spacecraft id.
    2. Name – spacecraft name.
    3. Propellant – spacecraft propellant.
    4. description – spacecraft description.

    We create the getters and setters of these instance fields.

    package com.tutorials.hp.mdmysqlselect.mDataObject;
    
    public class Spacecraft {
        int id;
        String name,propellant,description;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPropellant() {
            return propellant;
        }
    
        public void setPropellant(String propellant) {
            this.propellant = propellant;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    }
    
    (b). CustomAdapter.java

    This class will be deriving from android.widget.BaseAdapter. This class is public class.

    This class will maintain a couple of instance fields:

        Context c;
        ArrayList<Spacecraft> spacecrafts;
        LayoutInflater inflater;
    1. Context object – Will assist in inflation of our model layout.
    2. ArrayList of generic type Spacecraft class.
    3. LayoutInflater object to inflate our model.xml layout.

    The constructor of this class will take in a Context object and an ArrayList of spacecrafts objects.

    Then inside the Constructor we assign those objects to their respective class instance fields that we had defined.

    this.c = c;
    this.spacecrafts = spacecrafts;

    We then initialiaze our LayoutInflater class: inflater= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE) assigning to LayoutInflater class.

    LayoutInflater instance will later allow us inflate our XML layout into view object.

    After deriving from baseadapter, we will be forced to implement a couple of abstract methods.
    These include :

    1. getCount() – return the number of spacecrafts to bind to our ListView.
    2. getItem()– get a single spacecraft object.
    3. getView() – inflate the model.xml layout and return it as a view object.
    package com.tutorials.hp.mdmysqlselect.mListView;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.tutorials.hp.mdmysqlselect.R;
    import com.tutorials.hp.mdmysqlselect.mDataObject.Spacecraft;
    
    import java.util.ArrayList;
    
    public class CustomAdapter extends BaseAdapter {
    
        Context c;
        ArrayList<Spacecraft> spacecrafts;
        LayoutInflater inflater;
    
        public CustomAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
            this.c = c;
            this.spacecrafts = spacecrafts;
    
            //INITIALIE
            inflater= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return spacecrafts.size();
        }
    
        @Override
        public Object getItem(int position) {
            return spacecrafts.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return spacecrafts.get(position).getId();
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if(convertView==null)
            {
                convertView=inflater.inflate(R.layout.model,parent,false);
            }
    
            TextView nameTxt= (TextView) convertView.findViewById(R.id.nameTxt);
            TextView propellantTxt= (TextView) convertView.findViewById(R.id.propellantTxt);
            TextView descTxt= (TextView) convertView.findViewById(R.id.descTxt);
    
            nameTxt.setText(spacecrafts.get(position).getName());
            propellantTxt.setText(spacecrafts.get(position).getPropellant());
            descTxt.setText(spacecrafts.get(position).getDescription());
    
            //ITEM CLICKS
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(c,spacecrafts.get(position).getName(),Toast.LENGTH_SHORT).show();
                }
            });
    
            return convertView;
        }
    }
    
    (c). Connector.java

    Next we come to our Connector.java class.

    This class is a public class with one static method.

    This method is our connect(..) method. This method will take a string object we are calling urlAddress to represent the URL string to our server side PHP script that will allow us fetch data from mysql database.

    This method will return us a java.net.HttpURLConnection.

    We’ll have a try-catch block, catching two exceptions :

    1. java.net.MalformedURLException – Raised when a malformed URL is encountered.
    2. java.io.IOException – Raised when an IO(Input Output) error has occured.

    First we attempt to instantiate a java.net.URL passing in our URL address. URL stands for Uniform Resouce Locator and points to a Resource in a the World Wide Web. In this case that resource will be our php script.

    url.openConnection() will return us a URLConnection object which represents the connection to the remote object referred to by the URL.

    We cast that URLConnection to HttpURLConnection. HttpURLConnection is a url connection which supports HTTP specific features. It works with the HTTP protocol.

    con.setRequestMethod() will set the HTTP Request method that we support. These can be :

    1. GET.
    2. POST.
    3. PUT.
    4. DELETE.
    5. HEAD.
    6. OPTIONS.

    We use GET since we are fetching data.

    con.setReadTimeout() will specify the timeout for reading our resouce while con.setConnectTimeout() indicates the timeout for our connection.

    con.setDoInput() indicates that our connection supports input of data.

    package com.tutorials.hp.mdmysqlselect.mMySQL;
    
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class Connector {
    
        public static HttpURLConnection connect(String urlAddress)
        {
            try {
                URL url=new URL(urlAddress);
                HttpURLConnection con= (HttpURLConnection) url.openConnection();
    
                //SET PROPS
                con.setRequestMethod("GET");
                con.setConnectTimeout(20000);
                con.setReadTimeout(20000);
                con.setDoInput(true);
    
                return con;
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
    }
    
    (d). DataParser.java

    This is our Data Parser class.

    package com.tutorials.hp.mdmysqlselect.mMySQL;
    
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.tutorials.hp.mdmysqlselect.mDataObject.Spacecraft;
    import com.tutorials.hp.mdmysqlselect.mListView.CustomAdapter;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    
    public class DataParser  extends AsyncTask<Void,Void,Integer>{
    
        Context c;
        ListView lv;
        String jsonData;
    
        ProgressDialog pd;
        ArrayList<Spacecraft> spacecrafts=new ArrayList<>();
    
        public DataParser(Context c, ListView lv, String jsonData) {
            this.c = c;
            this.lv = lv;
            this.jsonData = jsonData;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
            pd=new ProgressDialog(c);
            pd.setTitle("Parse");
            pd.setMessage("Parsing...Please wait");
            pd.show();
        }
    
        @Override
        protected Integer doInBackground(Void... params) {
            return this.parseData();
        }
    
        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
    
            pd.dismiss();
            if(result==0)
            {
                Toast.makeText(c,"Unable to parse",Toast.LENGTH_SHORT).show();
            }else {
                //CALL ADAPTER TO BIND DATA
                CustomAdapter adapter=new CustomAdapter(c,spacecrafts);
                lv.setAdapter(adapter);
            }
        }
    
        private int parseData()
        {
            try {
                JSONArray ja=new JSONArray(jsonData);
                JSONObject jo=null;
    
                spacecrafts.clear();
                Spacecraft s=null;
    
                for(int i=0;i<ja.length();i++)
                {
                    jo=ja.getJSONObject(i);
    
                    int id=jo.getInt("id");
                    String name=jo.getString("name");
                    String propellant=jo.getString("propellant");
                    String description=jo.getString("description");
    
                    s=new Spacecraft();
                    s.setId(id);
                    s.setName(name);
                    s.setPropellant(propellant);
                    s.setDescription(description);
    
                    spacecrafts.add(s);
    
                }
    
                return 1;
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            return 0;
        }
    }
    
    (e). Downloader.java
    package com.tutorials.hp.mdmysqlselect.mMySQL;
    
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    
    public class Downloader extends AsyncTask<Void,Void,String> {
    
        Context c;
        String urlAddress;
        ListView lv;
    
        ProgressDialog pd;
    
        public Downloader(Context c, String urlAddress, ListView lv) {
            this.c = c;
            this.urlAddress = urlAddress;
            this.lv = lv;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
            pd=new ProgressDialog(c);
            pd.setTitle("Fetch");
            pd.setMessage("Fetching....Please wait");
            pd.show();
        }
    
        @Override
        protected String doInBackground(Void... params) {
            return this.downloadData();
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
    
            pd.dismiss();
    
            if(s==null)
            {
                Toast.makeText(c,"Unsuccessfull,Null returned",Toast.LENGTH_SHORT).show();
            }else
            {
                //CALL DATA PARSER TO PARSE
                DataParser parser=new DataParser(c,lv,s);
                parser.execute();
    
            }
    
        }
    
        private String downloadData()
        {
            HttpURLConnection con=Connector.connect(urlAddress);
            if(con==null)
            {
                return null;
            }
    
            InputStream is=null;
            try {
    
                is=new BufferedInputStream(con.getInputStream());
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
    
                String line=null;
                StringBuffer response=new StringBuffer();
    
                if(br != null)
                {
                    while ((line=br.readLine()) != null)
                    {
                        response.append(line+"n");
                    }
    
                    br.close();
    
                }else
                {
                    return null;
                }
    
                return response.toString();
    
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(is != null)
                {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            return null;
        }
    }
    
    (f). MainActivity.java
    package com.tutorials.hp.mdmysqlselect;
    
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ListView;
    
    import com.tutorials.hp.mdmysqlselect.mMySQL.Downloader;
    
    public class MainActivity extends AppCompatActivity {
    
        //spacecraft_select.php is our pho code. It is contained in 
        //a folder called android. : C:wampwwwandroidspacecraft_select.php
        String urlAddress="http://10.0.2.2/android/spacecraft_select.php";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            final ListView lv= (ListView) findViewById(R.id.lv);
    
            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Downloader d=new Downloader(MainActivity.this,urlAddress,lv);
                    d.execute();
                }
            });
        }
    
    }
    

     

  2. Adv
  3.  Android MySQL РSelect and Show in ListView(HTTPURLConnection).

    Previously we had seen how to connect to mysql and isnert data into database from android. Well that was a HTTP POST request we were making.

    We can also retrieve data and show them into a ListView.

    While fetching data we will show a progress dialog.

    HttpURLConnection

    Still we use the standard Android Networking API that is java.net.HTTURLConnection. Read more about HttpUrlConnection here.

    Our MySQL Database

    Here’s our MySQL table structure:

    We have the following fields:

    1. Id(AutoIncremented) – Integer.
    2. Name – String.
    3. Position – String.

    Read more about mysql here.

    Project Structure

    Here’s the project structure:

    Let’s go.

    1. Gradle Scripts

    In our app level build.gradle we add some dependencies.

    (a). Build.gradle

    We add android.support:appcompat-v7 and android.support:design.

        dependencies {
            compile fileTree(dir: 'libs', include: ['*.jar'])
            testCompile 'junit:junit:4.12'
            compile 'com.android.support:appcompat-v7:23.2.1'
            compile 'com.android.support:design:23.2.1'
        }

    2. Our PHP Script

    Here’s the PHP script that will connect to the MySQL database.

        <?php
    
        $host='127.0.0.1';
        $username='root';
        $pwd='';
        $db="playersdb";
    
        $con=mysqli_connect($host,$username,$pwd,$db) or die('Unable to connect');
    
        if(mysqli_connect_error($con))
        {
            echo "Failed to Connect to Database ".mysqli_connect_error();
        }
    
        $query=mysqli_query($con,"SELECT * FROM playerstb");
        if($query)
        {
            while($row=mysqli_fetch_array($query))
            {
                $flag[]=$row;
            }
    
            print(json_encode($flag));
        }
        mysqli_close($con);
        ?>

    3. AndroidManifest.xml

    Add the permission for internet in the androidmanifest.xml.

        <uses-permission android_name="android.permission.INTERNET"

    4. Layouts

    Let’s create some layouts.

    (a). activity_main.xml

    Our MainActivity’s primary layout. Will get inflated into MainActivity user interface.
    At the root we have android.support.design.widget.CoordinatorLayout.

    This layout has the following responsibilities: No. Responsibility
    1. Define the AppbarLayout using android.support.design.widget.AppBarLayout tag.
    2. Define the ToolBar using the android.support.v7.widget.Toolbar tag.
    3. Define the FloatingActionButton using the android.support.design.widget.FloatingActionButton tag.
    4. Include the content_main.xml which will render our other views and widgets.
        <?xml version="1.0" encoding="utf-8"?>
        <android.support.design.widget.CoordinatorLayout 
            
            
            android_layout_width="match_parent"
            android_layout_height="match_parent"
            android_fitsSystemWindows="true"
            tools_context="com.tutorials.hp.mysqlselector.MainActivity">
    
            <android.support.design.widget.AppBarLayout
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_theme="@style/AppTheme.AppBarOverlay">
    
                <android.support.v7.widget.Toolbar
                    android_id="@+id/toolbar"
                    android_layout_width="match_parent"
                    android_layout_height="?attr/actionBarSize"
                    android_background="?attr/colorPrimary"
                    app_popupTheme="@style/AppTheme.PopupOverlay" />
    
            </android.support.design.widget.AppBarLayout>
    
            <include layout="@layout/content_main" />
    
            <android.support.design.widget.FloatingActionButton
                android_id="@+id/fab"
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_layout_gravity="bottom|end"
                android_layout_margin="@dimen/fab_margin"
                android_src="@android:drawable/ic_dialog_email" />
    
        </android.support.design.widget.CoordinatorLayout>

    (b). content_main.xml

    Our content_main.xml layout. The root tag is RelativeLayout.

    It has the following responsibilities:

    No. Responsibility
    1. Define/Hold the ListView that will display our data from MySQL database.
    2. It will be included inside the activity_main.xml to form the MainActivity layout.
        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout 
            
            
            android_layout_width="match_parent"
            android_layout_height="match_parent"
            android_paddingBottom="@dimen/activity_vertical_margin"
            android_paddingLeft="@dimen/activity_horizontal_margin"
            android_paddingRight="@dimen/activity_horizontal_margin"
            android_paddingTop="@dimen/activity_vertical_margin"
            app_layout_behavior="@string/appbar_scrolling_view_behavior"
            tools_context="com.tutorials.hp.mysqlselector.MainActivity"
            tools_showIn="@layout/activity_main">
    
            <TextView
                android_padding="5dp"
                android_id="@+id/textView"
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_text="Players List!" />
            <ListView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_id="@+id/lv"
                android_layout_below="@+id/textView"
                android_layout_alignParentLeft="true"
                android_layout_alignParentStart="true" />
        </RelativeLayout>

    5. Java Classes

    We have three custom java classes.

    (a). Downloader.java

    Our Downloader.java class, a public class that will derive from android.os.AsyncTask. This provides us with easy to use threading capabilities.

    The purposes of this class includes:

    No. Responsibility
    1. Receive an android.content.Context object, a URL address and a ListView widget from the MainActivity.
    2. Instantiate,show and dismiss progress dialog.
    3. Establish connection to the provided URL via the java.net.HTTPURLConnection.
    4. Download data and return it as a string in the background thread.
    5. Catch IOException and MalformedURLException.
    6. Instantiate Parser object, pass Context, downloaded string and listview.And execute it.
        package com.tutorials.hp.mysqlselector;
    
        import android.app.ProgressDialog;
        import android.content.Context;
        import android.os.AsyncTask;
        import android.widget.ListView;
        import android.widget.Toast;
    
        import java.io.BufferedInputStream;
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.net.HttpURLConnection;
        import java.net.MalformedURLException;
        import java.net.URL;
    
        public class Downloader extends AsyncTask<Void,Integer,String> {
    
            Context c;
            String address;
            ListView lv;
    
            ProgressDialog pd;
    
            public Downloader(Context c, String address, ListView lv) {
                this.c = c;
                this.address = address;
                this.lv = lv;
            }
    
            //B4 JOB STARTS
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
                pd=new ProgressDialog(c);
                pd.setTitle("Fetch Data");
                pd.setMessage("Fetching Data...Please wait");
                pd.show();
            }
    
            @Override
            protected String doInBackground(Void... params) {
                String data=downloadData();
                return data;
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
    
                pd.dismiss();;
    
                if(s != null)
                {
                    Parser p=new Parser(c,s,lv);
                    p.execute();
    
                }else
                {
                    Toast.makeText(c,"Unable to download data",Toast.LENGTH_SHORT).show();
                }
            }
    
            private String downloadData()
            {
                //connect and get a stream
                InputStream is=null;
                String line =null;
    
                try {
                    URL url=new URL(address);
                    HttpURLConnection con= (HttpURLConnection) url.openConnection();
                    is=new BufferedInputStream(con.getInputStream());
    
                    BufferedReader br=new BufferedReader(new InputStreamReader(is));
    
                    StringBuffer sb=new StringBuffer();
    
                    if(br != null) {
    
                        while ((line=br.readLine()) != null) {
                            sb.append(line+"n");
                        }
    
                    }else {
                        return null;
                    }
    
                    return sb.toString();
    
                    } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if(is != null)
                    {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            return null;
            }
        }
    (b). Parser.java

    This is our custom Parser class. The class still extends android.os.AsyncTask.

    This class will parse our JSON string and fill our listview.

    It has the following roles:

    No. Responsibility
    1. Receive Context object,ListView and the downloaded data from Downloaded class.
    2. Define an arraylist to hold the downloaded data.
    3. Instantiate, show and dismiss the progress dialog.
    4. Parse the json string and populate our ArrayList. We do this in the background thread inside the doInbackground() method.
    5. Bind our arraylist to our ListView.
        package com.tutorials.hp.mysqlselector;
    
        import android.app.ProgressDialog;
        import android.content.Context;
        import android.os.AsyncTask;
        import android.support.design.widget.Snackbar;
        import android.view.View;
        import android.widget.AdapterView;
        import android.widget.ArrayAdapter;
        import android.widget.ListView;
        import android.widget.Toast;
    
        import org.json.JSONArray;
        import org.json.JSONException;
        import org.json.JSONObject;
    
        import java.util.ArrayList;
        import java.util.List;
    
        public class Parser extends AsyncTask<Void,Integer,Integer> {
    
            Context c;
            ListView lv;
            String data;
    
            ArrayList<String> players=new ArrayList<>();
            ProgressDialog pd;
    
            public Parser(Context c, String data, ListView lv) {
                this.c = c;
                this.data = data;
                this.lv = lv;
            }
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
                pd=new ProgressDialog(c);
                pd.setTitle("Parser");
                pd.setMessage("Parsing ....Please wait");
                pd.show();
            }
    
            @Override
            protected Integer doInBackground(Void... params) {
    
                return this.parse();
            }
    
            @Override
            protected void onPostExecute(Integer integer) {
                super.onPostExecute(integer);
    
                if(integer == 1)
                {
                    //ADAPTER
                    ArrayAdapter<String> adapter=new ArrayAdapter<String>(c,android.R.layout.simple_list_item_1,players);
    
                    //ADAPT TO LISTVIEW
                    lv.setAdapter(adapter);
    
                    //LISTENET
                    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Snackbar.make(view,players.get(position),Snackbar.LENGTH_SHORT).show();;
                        }
                    });
    
                }else
                {
                    Toast.makeText(c,"Unable to Parse",Toast.LENGTH_SHORT).show();
                }
    
                pd.dismiss();
            }
    
            //PARSE RECEIVED DATA
            private int parse()
            {
                try
                {
                    //ADD THAT DATA TO JSON ARRAY FIRST
                    JSONArray ja=new JSONArray(data);
    
                    //CREATE JO OBJ TO HOLD A SINGLE ITEM
                    JSONObject jo=null;
    
                    players.clear();
    
                    //LOOP THRU ARRAY
                    for(int i=0;i<ja.length();i++)
                    {
                        jo=ja.getJSONObject(i);
    
                        //RETRIOEVE NAME
                        String name=jo.getString("Name");
    
                        //ADD IT TO OUR ARRAYLIST
                        players.add(name);
                    }
    
                    return 1;
    
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
                return 0;
            }
        }
    (c). MainActivity.java

    Our public class that will be the launcher activity. It will derive from android.support.v7.app.AppCompatActivity.

    This class the following responsibilities:

    No. Responsibility
    1. Allow itself to become an android activity component by

    deriving from android.support.v7.app.AppCompatActivity.|
    |2.|Listen to activity creation callbacks by overrding the onCreate() method.|
    |3.|Invoke the onCreate() method of the parent Activity

    class and tell it of a Bundle we’ve received. |
    |4.|Inflate the activity_main.xml into a View object and set

    it as the content view of this activity.|
    |5.| Define our URL address. This URL address leads to ou PHP script|
    |6.| Reference the android.support.v7.widget.Toolbar and set it to the SupportActionBar.|
    |7.| Reference ListView from layout.|
    |8.| Instantiate Downloader class. Pass in the URL addtess, ListView and Context.|
    |9.| Execute the download operation.|

        package com.tutorials.hp.mysqlselector;
    
        import android.os.Bundle;
        import android.support.design.widget.FloatingActionButton;
        import android.support.design.widget.Snackbar;
        import android.support.v7.app.AppCompatActivity;
        import android.support.v7.widget.Toolbar;
        import android.view.View;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.widget.ListView;
    
        public class MainActivity extends AppCompatActivity {
    
            String url="http://10.0.2.2/android/players.php";
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
                setSupportActionBar(toolbar);
    
                final ListView lv= (ListView) findViewById(R.id.lv);
                final Downloader d=new Downloader(this,url,lv);
    
                FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
                fab.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //EXECUTE DOWNLOAD
                        d.execute();
                    }
                });
            }
        }
    

    Download

    You can download the code here.


  4. Adv
  5. Android MySQL – ListView CheckBoxes – INSERT,SELECT,SHOW

    This is an Android MySQ ListView with CheckBoxes tutorial. We want to see how to work with boolean text values. We save them into mysql and also retrieve them.

     

    • We want to see how to work with Android PHP MySQL and Boolean values and strings.
    • First we want to insert data to MySQL database.
    • The data shall be from a material edittext,a spinner and a checkbox.
    • The user types his favorite spacecraft name in the edittext.Then selects the spacecraft’s propellant from a spinner.
    • He then selects if the technology exists yet or not in the checkbox.
    • We shall actually be mapping integers to boolean and vice versa since MySQL doesn’t have a native boolean data type.
    • Our adapterview is ListView.It has checkboxes to hold boolean values from MySQL database.

    Video Tutorial(ProgrammingWizards TV Channel)

    Well we have a video tutorial as an alternative to this. If you prefer tutorials like this one then it would be good you subscribe to our YouTube channel.

    Basically we have a TV for programming where do daily tutorials especially android.

    Android MySQL ListView CheckBoxes Insert, Select Show Example

    Let’s look at our example:

    Android MySQL ListView

    MySQL Table

    Here’s our mysql table structure:

    Table Structure

    Project Structure

    Here’s our project structure.

    Project Structure

    1. PHP Code

    Here are our php code. Place them in the same folder.

    (a) Constants.php
    <?php
    
    class Constants
    {
        //DATABASE DETAILS
        static $DB_SERVER="localhost";
        static $DB_NAME="galileoDB";
        static $USERNAME="root";
        static $PASSWORD="";
        const TB_NAME="galileoTB";
        //STATEMENTS
        static $SQL_SELECT_ALL="SELECT * FROM galileoTB";
    }
    (b) CRUD.php
    <?php
    
    require_once("/DBAdapter.php");
    if($_POST['action']=="save"){
    
             $dbAdapter=new DBAdapter();
             $name=$_POST['name'];
             $propellant=$_POST['propellant'];
             $technologyexists=$_POST['technologyexists'];
            $dbAdapter->insert(array($name,$propellant,$technologyexists));
    }
    else if($_POST['action']=="update")
    {
             $dbAdapter=new DBAdapter();
             $id=$_POST['id'];
             $name=$_POST['name'];
             $propellant=$_POST['propellant'];
             $technologyexists=$_POST['technologyexists'];
            $dbAdapter->update($id,array($name,$propellant,$technologyexists));
    
    }
    else if($_POST['action']=="delete")
    {
             $dbAdapter=new DBAdapter();
             $id=$_POST['id'];
    
            $dbAdapter->delete($id);
    }
    ?>
    (c) DBAdapter.php
    <?php
    
    require_once("/Constants.php");
    class DBAdapter
    {
    /*******************************************************************************************************************************************/
    /*
       1.CONNECT TO DATABASE.
       2. RETURN CONNECTION OBJECT
    */
        public function connect()
        {
    
           $con=mysqli_connect(Constants::$DB_SERVER,Constants::$USERNAME,Constants::$PASSWORD,Constants::$DB_NAME);
            if(mysqli_connect_error(!$con))
            {
               // echo "Unable To Connect";
                return null;
            }else
            {
    
                return $con;
            }
        }
        /*******************************************************************************************************************************************/
    /*
       1.INSERT SPACECRAFT INTO DATABASE
     */
        public function insert($s)
        {
            // INSERT
            $con=$this->connect();
    
            if($con != null)
            {
                $sql="INSERT INTO galileoTB(name,propellant,technologyexists) VALUES('$s[0]','$s[1]','$s[2]')";
                try
                {
                    $result=mysqli_query($con,$sql);
                    if($result)
                    {
                        print(json_encode(array("Success")));
                    }else
                    {
                        print(json_encode(array("Unsuccessfull")));
                    }
                }catch (Exception $e)
                {
                   print(json_encode(array("PHP EXCEPTION : CAN'T SAVE TO MYSQL. "+$e->getMessage())));
                }
            }else{
                print(json_encode(array("PHP EXCEPTION : CAN'T CONNECT TO MYSQL. NULL CONNECTION.")));
            }
            mysqli_close($con);
        }
    /*******************************************************************************************************************************************/
    /*
       1.SELECT FROM DATABASE.
    */
        public function select()
        {
           $con=$this->connect();
            if($con != null)
            {
                $retrieved=mysqli_query($con,Constants::$SQL_SELECT_ALL);
                if($retrieved)
                {
                    while($row=mysqli_fetch_array($retrieved))
                    {
    
                       // echo $row["name"] ,"    t | ",$row["propellant"],"</br>";
                       $spacecrafts[]=$row;
                    }
                    print(json_encode($spacecrafts));
                }else
                {
                     print(json_encode(array("PHP EXCEPTION : CAN'T RETRIEVE FROM MYSQL. ")));
                }
            }else{
                print(json_encode(array("PHP EXCEPTION : CAN'T CONNECT TO MYSQL. NULL CONNECTION.")));
            }
            mysqli_close($con);
        }
    /*******************************************************************************************************************************************/
    /*
       1.UPDATE  DATABASE.
    
    */
        public function update($id, $s)
        {
            // UPDATE
            $con=$this->connect();
    
            if($con != null)
            {
                $sql="UPDATE galileoTB SET name='$s[0]',propellant='$s[1]',technologyexists='$s[2]' WHERE id='$id'";
                try
                {
                    $result=mysqli_query($con,$sql);
                    if($result)
                    {
                        print(json_encode(array("Successfully Updated")));
                    }else
                    {
                        print(json_encode(array("Not Successfully Updated")));
                    }
                }catch (Exception $e)
                {
                     print(json_encode(array("PHP EXCEPTION : CAN'T UPDATE INTO MYSQL. "+$e->getMessage())));
                }
            }else{
                print(json_encode(array("PHP EXCEPTION : CAN'T CONNECT TO MYSQL. NULL CONNECTION.")));
            }
            mysqli_close($con);
        }
    /*******************************************************************************************************************************************/
    /*
       1.DELETE SPACECRAFT FROM DATABASE.
    
    */
        public function delete($id)
        {
            $con=$this->connect();
    
            if($con != null)
            {
    //            $name=$_POST['Name'];
    //            $pos=$_POST['Position'];
    //            $team=$_POST['Team'];
                $sql="DELETE FROM galileoTB WHERE id='$id'";
                try
                {
                    $result=mysqli_query($con,$sql);
                    if($result)
                    {
                        print(json_encode(array("Successfully Deleted")));
                    }else
                    {
                        print(json_encode(array("Not Successfully Deleted")));
                    }
                }catch (Exception $e)
                {
                    print(json_encode(array("PHP EXCEPTION : CAN'T DELETE FROM MYSQL. "+$e->getMessage())));
                }
            }else{
                print(json_encode(array("PHP EXCEPTION : CAN'T CONNECT TO MYSQL. NULL CONNECTION.")));
            }
            mysqli_close($con);
        }
    
    }
    (d) Index.php
    <?php
    
    require_once("/DBAdapter.php");
        $dbAdapter=new DBAdapter();
        $dbAdapter->select();
    ?>

    2. Gradle Scripts

    Here are our gradle scripts in our build.gradle file(s).

    (a). build.gradle(app)

    Here’s our app level build.gradle file. We have the dependencies DSL where we add our dependencies.

    This file is called app level build.gradle since it’s located in the app folder of the project.

    If you are using Android Studio version 3 and above use implementation keyword while if you are using a version less than 3 then still use the compile keyword.

    Once you’ve modified this build.gradle file you have to sync your project. Android Studio will indeed prompt you to do so.

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:24.2.0'
        compile 'com.android.support:design:24.2.0'
        compile 'com.android.support:cardview-v7:24.2.0'
        compile 'com.amitshekhar.android:android-networking:0.2.0'
    }

    [notice]
    We are using Fast Android Networking Library as our HTTP Client. You may use newer versions.
    [/notice]

    3. Resoources.

    Android platform provides a powerful and flexible way of adding static content as a resource.

    These static content will also be packaged into the APK file. The static content will be stored either as a resource or as an asset.

    Resources belong to a given type. These types can be:

    1. Drawable.
    2. Layout.
    3. Value.

    Let’s start by looking at the layout resources

    (a). model.xml

    Our row model layout.

    ?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView 
        android_orientation="horizontal" android_layout_width="match_parent"
        
        android_layout_margin="10dp"
        card_view_cardCornerRadius="5dp"
        card_view_cardElevation="5dp"
        android_layout_height="200dp">
    
            <LinearLayout
                android_orientation="vertical"
                android_layout_width="match_parent"
                android_layout_height="match_parent">
    
                <TextView
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    android_textAppearance="?android:attr/textAppearanceLarge"
                    android_text="Name"
                    android_id="@+id/nameTxt"
                    android_padding="10dp"
                    android_textColor="@color/colorAccent"
                    android_textStyle="bold"
                    android_layout_alignParentLeft="true"
                    />
    
                <TextView
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content"
                    android_textAppearance="?android:attr/textAppearanceLarge"
                    android_text="Propellant....................."
                    android_id="@+id/txtPropellant"
                    android_padding="10dp"
                    android_layout_alignParentLeft="true"
                    />
                <CheckBox
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content"
                    android_textSize="25dp"
                    android_id="@+id/chkTechExists"
                    android_checked="true" />
    
        </LinearLayout>
    
    </android.support.v7.widget.CardView>
    (b). content_main.xml

    Our content_main layout. This layout is being inserted into our activity_main.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
        
        
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.mysqllistviewbool.MainActivity"
        tools_showIn="@layout/activity_main">
        <LinearLayout
            android_orientation="vertical"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">
    
            <android.support.design.widget.TextInputEditText
                android_id="@+id/nameTxt"
                android_hint="Name"
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_textStyle="bold"
                android_textSize="25dp"
                android_enabled="true"
                android_focusable="true" />
    
            <LinearLayout
                android_orientation="horizontal"
                android_padding="5dp"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">
                <TextView
                    android_textSize="25dp"
                    android_text="Propellant"
                    android_textStyle="bold"
                    android_layout_width="250dp"
                    android_layout_height="wrap_content" />
                <Spinner
                    android_id="@+id/sp"
                    android_textSize="25dp"
                    android_textStyle="bold"
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content" />
            </LinearLayout>
    
            <LinearLayout
                android_orientation="horizontal"
                android_padding="5dp"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">
                <TextView
                    android_textSize="25dp"
                    android_text="Technology Exists ??"
                    android_textStyle="bold"
                    android_layout_width="250dp"
                    android_layout_height="wrap_content" />
                <CheckBox
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content"
                    android_textSize="25dp"
                    android_id="@+id/techExists"
                    android_checked="true" />
            </LinearLayout>
    
            <RelativeLayout
                android_orientation="horizontal"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">
    
                <Button android_id="@+id/addBtn"
                    android_layout_width="wrap_content"
                    android_layout_height="60dp"
                    android_text="Save"
                    android_clickable="true"
                    android_padding="5dp"
                    android_background="#009968"
                    android_textColor="@android:color/white"
                    android_textStyle="bold"
                    android_textSize="20dp" />
    
                <Button android_id="@+id/refreshBtn"
                    android_layout_width="wrap_content"
                    android_layout_height="60dp"
                    android_text="Retrieve"
                    android_padding="5dp"
                    android_clickable="true"
                    android_background="#f38630"
                    android_textColor="@android:color/white"
                    android_layout_alignParentTop="true"
                    android_layout_alignParentRight="true"
                    android_layout_alignParentEnd="true"
                    android_textStyle="bold"
                    android_textSize="20dp" />
    
            </RelativeLayout>
    
            <ListView
                android_id="@+id/lv"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">
    
            </ListView>
    
        </LinearLayout>
    </RelativeLayout>
    (c). activity_main.xml

    Our activity_main layout.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 
        
        
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_fitsSystemWindows="true"
        tools_context="com.tutorials.hp.mysqllistviewbool.MainActivity">
    
        <android.support.design.widget.AppBarLayout
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android_id="@+id/toolbar"
                android_layout_width="match_parent"
                android_layout_height="?attr/actionBarSize"
                android_background="?attr/colorPrimary"
                app_popupTheme="@style/AppTheme.PopupOverlay" />
    
        </android.support.design.widget.AppBarLayout>
    
        <include layout="@layout/content_main" />
    
        <android.support.design.widget.FloatingActionButton
            android_id="@+id/fab"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="bottom|end"
            android_layout_margin="@dimen/fab_margin"
            android_src="@android:drawable/ic_dialog_email" />
    
    </android.support.design.widget.CoordinatorLayout>
    (a). Spacecraft.java

    First we have a data object POJO class as below.

    package com.tutorials.hp.mysqllistviewbool.mModel;
    
    public class Spacecraft {
        /*
        INSTANCE FIELDS
         */
        private int id;
        private String name;
        private String propellant;
        private int technologyExists;
    
        /*
        GETTERS AND SETTERS
         */
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPropellant() {
            return propellant;
        }
    
        public void setPropellant(String propellant) {
            this.propellant = propellant;
        }
    
        public int getTechnologyExists() {
            return technologyExists;
        }
    
        public void setTechnologyExists(int technologyExists) {
            this.technologyExists = technologyExists;
        }
        /*
        TOSTRING
         */
        @Override
        public String toString() {
            return name;
        }
    }
    (b). MySQLClient.java

    Our most important class is our MySQL Client class.It is responsible fro bothh connecting,inserting and retrieving data and handling errors appropriately.We are using the easy to use yet efficient Android Networking Library.

    package com.tutorials.hp.mysqllistviewbool.mMySQL;
    
    import android.content.Context;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.Spinner;
    import android.widget.Toast;
    
    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONArrayRequestListener;
    import com.tutorials.hp.mysqllistviewbool.mAdapter.ListViewAdapter;
    import com.tutorials.hp.mysqllistviewbool.mModel.Spacecraft;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    
    public class MySQLClient {
    
        //SAVE/RETRIEVE URLS
        private static final String DATA_INSERT_URL="http://10.0.2.2/android/Aristotle/crud.php";
        private static final String DATA_RETRIEVE_URL="http://10.0.2.2/android/Aristotle/index.php";
    
        //INSTANCE FIELDS
        private final Context c;
        private ListViewAdapter adapter ;
    
        public MySQLClient(Context c) {
            this.c = c;
    
        }
        /*
       SAVE/INSERT
        */
        public void add(Spacecraft s, final View...inputViews)
        {
            if(s==null)
            {
                Toast.makeText(c, "No Data To Save", Toast.LENGTH_SHORT).show();
            }
            else
            {
                AndroidNetworking.post(DATA_INSERT_URL)
    
                        .addBodyParameter("action","save")
                        .addBodyParameter("name",s.getName())
                        .addBodyParameter("propellant",s.getPropellant())
                        .addBodyParameter("technologyexists",String.valueOf(s.getTechnologyExists()))
                        .setTag("TAG_ADD")
                        .build()
                        .getAsJSONArray(new JSONArrayRequestListener() {
                            @Override
                            public void onResponse(JSONArray response) {
    
                                if(response != null)
                                    try {
                                        //SHOW RESPONSE FROM SERVER
                                        String responseString = response.get(0).toString();
                                        Toast.makeText(c, "PHP SERVER RESPONSE : " + responseString, Toast.LENGTH_SHORT).show();
    
                                        if (responseString.equalsIgnoreCase("Success")) {
                                            //RESET VIEWS
                                            EditText nameTxt = (EditText) inputViews[0];
                                            Spinner spPropellant = (Spinner) inputViews[1];
    
                                            nameTxt.setText("");
                                            spPropellant.setSelection(0);
                                        }else
                                        {
                                            Toast.makeText(c, "PHP WASN'T SUCCESSFUL. ", Toast.LENGTH_SHORT).show();
    
                                        }
    
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                        Toast.makeText(c, "GOOD RESPONSE BUT JAVA CAN'T PARSE JSON IT RECEIVED : "+e.getMessage(), Toast.LENGTH_SHORT).show();
                                    }
    
                            }
    
                            //ERROR
                            @Override
                            public void onError(ANError anError) {
                                Toast.makeText(c, "UNSUCCESSFUL :  ERROR IS : "+anError.getMessage(), Toast.LENGTH_SHORT).show();
                            }
    
                        });
    
            }
        }
    
        /*
        RETRIEVE/SELECT/REFRESH
         */
        public void retrieve(final ListView lv)
        {
            final ArrayList<Spacecraft> spacecrafts = new ArrayList<>();
    
            AndroidNetworking.get(DATA_RETRIEVE_URL)
                    .setPriority(Priority.HIGH)
                    .build()
                    .getAsJSONArray(new JSONArrayRequestListener() {
                        @Override
                        public void onResponse(JSONArray response) {
                            JSONObject jo;
                            Spacecraft s;
                            try
                            {
                                for(int i=0;i<response.length();i++)
                                {
                                    jo=response.getJSONObject(i);
    
                                    int id=jo.getInt("id");
                                    String name=jo.getString("name");
                                    String propellant=jo.getString("propellant");
                                    String techExists=jo.getString("technologyexists");
    
                                    s=new Spacecraft();
                                    s.setId(id);
                                    s.setName(name);
                                    s.setPropellant(propellant);
                                    s.setTechnologyExists(techExists.equalsIgnoreCase("1") ? 1 : 0);
    
                                    spacecrafts.add(s);
                                }
    
                                //SET TO SPINNER
                                adapter =new ListViewAdapter(c,spacecrafts);
                                lv.setAdapter(adapter);
    
                            }catch (JSONException e)
                            {
                                Toast.makeText(c, "GOOD RESPONSE BUT JAVA CAN'T PARSE JSON IT RECEIEVED. "+e.getMessage(), Toast.LENGTH_LONG).show();
    
                            }
    
                        }
    
                        //ERROR
                        @Override
                        public void onError(ANError anError) {
                            anError.printStackTrace();
                            Toast.makeText(c, "UNSUCCESSFUL :  ERROR IS : "+anError.getMessage(), Toast.LENGTH_LONG).show();
    
                        }
                    });
        }
    }
    (c). ListViewAdapter.java

    We also have our ListView adapter to map our dataset to the adapterview.

    package com.tutorials.hp.mysqllistviewbool.mAdapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.CheckBox;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.tutorials.hp.mysqllistviewbool.R;
    import com.tutorials.hp.mysqllistviewbool.mModel.Spacecraft;
    
    import java.util.ArrayList;
    
    public class ListViewAdapter extends BaseAdapter {
    
        Context c;
        ArrayList<Spacecraft> spacecrafts;
    
        public ListViewAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
            this.c = c;
            this.spacecrafts = spacecrafts;
        }
    
        @Override
        public int getCount() {
            return spacecrafts.size();
        }
    
        @Override
        public Object getItem(int i) {
            return spacecrafts.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            if(view==null)
            {
                view= LayoutInflater.from(c).inflate(R.layout.model,viewGroup,false);
            }
    
            TextView txtName = (TextView) view.findViewById(R.id.nameTxt);
            TextView txtPropellant = (TextView) view.findViewById(R.id.txtPropellant);
    
            CheckBox chkTechExists = (CheckBox) view.findViewById(R.id.chkTechExists);
    
            final Spacecraft s= (Spacecraft) this.getItem(i);
    
            txtName.setText(s.getName());
            txtPropellant.setText(s.getPropellant());
            chkTechExists.setChecked( s.getTechnologyExists()==1);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(c, s.getName(), Toast.LENGTH_SHORT).show();
                }
            });
    
            return view;
        }
    }
    (d). MainActivity.java

    The main activity.

    package com.tutorials.hp.mysqllistviewbool;
    
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.TextInputEditText;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.ListView;
    import android.widget.Spinner;
    import android.widget.Toast;
    
    import com.tutorials.hp.mysqllistviewbool.mAdapter.ListViewAdapter;
    import com.tutorials.hp.mysqllistviewbool.mModel.Spacecraft;
    import com.tutorials.hp.mysqllistviewbool.mMySQL.MySQLClient;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
        //INSTANCE FIELDS
        private TextInputEditText txtName;
        private CheckBox chkTechnologyExists;
        private Spinner spPropellant;
        private ListView lv;
        private Button btnAdd,btnRetrieve;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            //REFERENCE VIEWS
            this.initializeViews();
    
            populatePropellants();
    
            //HANDLE EVENTS
            this.handleClickEvents();
    
            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    lv.setAdapter(new ListViewAdapter(MainActivity.this,new ArrayList<Spacecraft>()));
                }
            });
    
        }
    
        /*
        REFERENCE VIEWS
         */
        private void initializeViews()
        {
    
            txtName= (TextInputEditText) findViewById(R.id.nameTxt);
            chkTechnologyExists= (CheckBox) findViewById(R.id.techExists);
            spPropellant= (Spinner) findViewById(R.id.sp);
            lv= (ListView) findViewById(R.id.lv);
    
            btnAdd= (Button) findViewById(R.id.addBtn);
            btnRetrieve= (Button) findViewById(R.id.refreshBtn);
    
        }
    
        /*
        HANDLE CLICK EVENTS
         */
        private void handleClickEvents()
        {
            //EVENTS : ADD
            btnAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    //GET VALUES
                    String name=txtName.getText().toString();
                    String propellant=spPropellant.getSelectedItem().toString();
                    Boolean technologyexists=chkTechnologyExists.isChecked();
    
                    //BASIC CLIENT SIDE VALIDATION
                    if((name.length()<1 || propellant.length()<1  ))
                    {
                        Toast.makeText(MainActivity.this, "Please Enter all Fields", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        //SAVE
    
                        Spacecraft s=new Spacecraft();
                        s.setName(name);
                        s.setPropellant(propellant);
                        s.setTechnologyExists(technologyexists ? 1 : 0);
    
                        new MySQLClient(MainActivity.this).add(s,txtName,spPropellant);
                    }
                }
            });
    
            //EVENTS : RETRIEVE
            btnRetrieve.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    new MySQLClient(MainActivity.this).retrieve(lv);
    
                }
            });
    
        }
    
        private void populatePropellants()
        {
            ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item);
    
            adapter.add("None");
            adapter.add("Chemical Energy");
            adapter.add("Nuclear Energy");
            adapter.add("Laser Beam");
            adapter.add("Anti-Matter");
            adapter.add("Plasma Ions");
            adapter.add("Warp Drive");
    
            spPropellant.setAdapter(adapter);
            spPropellant.setSelection(0);
    
        }
    }

    Download

    Hey,everything is in source code reference that is well commented and easy to understand and can be downloaded below.

    Also check our video tutorial it’s more detailed and explained in step by step.

    No. Location Link
    1. GitHub Direct Download
    2. GitHub Browse
    3. YouTube Video Tutorial



Share an Example

Share an Example

Browse
What is the capital of Egypt? ( Cairo )