Anda di halaman 1dari 36

Membuat Aplikasi Client Server menggunakan Android, PHP dan MySQL

17 June 2013Leave a commentGo to comments

5 Votes

Posting kali ini, kita mencoba membuat aplikasi client server berbasis Android dan menghubungkan dengan
database MySQL. Client-server ? Ya…. Kita akan membuat aplikasi Android yang datanya akan disimpan pada
sebuah server. Bisa local (localhost) atau di internet.

Mengapa kita harus menympan data di database, bukankah di Android memiliki database untuk menyimpan
data ?. Sebenarnya Android memiliki fasilitas untuk menyimpan data yaitu:

1. Shared preferences. Terdiri dari key dan value data. Model ini biasanya untuk menyimpan settingan
(pengaturan) sebuah aplikasi.
2. File. Fasilitas ini juga dapat menyimpan data sama halnya dengan Shared Preferences, hanya saja data
disimpan ke dalam bentuk file. Misalnya: txt, xml atau bentuk file lainnya
3. SQLite Database. Fasilitas ini cukup idel untuk menyimpan data yang lumayan banyak. Berbeda halnya
dengan no 1 dan 2 di atas yang biasanya untuk menyimpan data yang sedikit seperti pengaturan. Dengan
SQLite, kita dapat melakukan query dan table-table seperti halnya database pada umumnya.
Untuk mempelajari ketiga fasilitas di atas, silakan klik http://developer.android.com/training/basics/data-
storage/index.html.

Ketiga fasilitas di atas menyimpan data pada ponsel pengguna (client). Nah, bagaimana jika ingin data itu
selalu update dan dapat mengaksesnya siapa saja dan dimana saja (anyone, anytime and anywhere)?. Itulah
alasanya mengapa kita memerlukan sebuah server dalam hal ini MySQL.

Aplikasi yang akan kita bangun tergambar seperti berikut:

Android, PHP, MySQL


Berdasarkan gambar di atas, ponsel Android akan melakukan request (get/post) ke server melalui internet.
Cara ini juga sama jika ingin aplikasi berada pada localhost. Selanjutnya web server (dalam hal ini PHP), akan
memproses request dari Android dan akan melakukan query ke database (MySQL). Jadi, akan ada tiga hal
yang harus kita lakukan:
1. Membuat Database
2. Membuat script PHP
3. Membuat aplikasi Android
OK….. langsung saja

1. Membuat database MySQL


Database: latihan_android

Table: mahasiswa (id, nim, nama, telp, alamat)

1 create database latihan_android;


2 use latihan_android;
3
4 CREATE TABLE IF NOT EXISTS `mahasiswa` (

5 `id` int(11) NOT NULL AUTO_INCREMENT,

6 `nim` varchar(11) NOT NULL,

7 `nama` varchar(100) NOT NULL,

8 `telp` varchar(50) NOT NULL,

9 `alamat` varchar(255) NOT NULL,

10 PRIMARY KEY (`id`)

11 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ;

12
13 --

14 -- Dumping data for table `mahasiswa`

15 --

16
17 INSERT INTO `mahasiswa` ( `nim`, `nama`, `telp`, `alamat`) VALUES

18 ( '2222', 'aaaa', '0801', 'Alamat 1'),

19 ( '1111', 'bbbb', '0802', 'Alamat 2'),

20 ( '2222', 'cccc', '0803', 'Alamat 3'),

21 ( '3333', 'dddd', '0804', 'Alamat 4'),

22 ( '1111', 'eeee', '0805', 'Alamat 5'),

23 ( '2222', 'ffff', '0806', 'Alamat 6'),

24 ( '3333', 'gggg', '0807', 'Alamat 7'),

25 ( '4444', 'hhhh', '0808', 'Alamat 8'),

26 ( '5555', 'iiii', '0809', 'Alamat 9');

2. Membuat script PHP


Database sudah selesai, selanjutnya adalah membuat script server side. Koq kita butuh script server side, Kita
kan belajar Android (Java) ? … Sebenarnya Android tidak dapat berkomunikasi langsung dengan MySQL untuk
memanipulasi database. Untuk itu, kita membutuhkan script server side misalnya ASP, JSP atau PHP untuk
bisa menjadi “jembatan” antara Android dengan MySQL. Jadi, Android hanya memberika perintah (request) ke
PHP dan PHP lah yang akan melaksanakan query ke MySQL.

Pada posting ini, kita membuat 5 (lima) file PHP.

1. index.php : sebagai file index dan hanya berisi HTML


2. connection.php: sebagai file koneksi ke database
3. select_all.php: untuk melakukan query select all, mengabil seluruh data dari table Mahasiswa
4. submit_mahasiswa.php : untuk memproses simpan dan update
5. delete_mahasiswa.php: untuk menghapus (delete) data mahasiswa
Semua file di atas diletakkan dalam direktori “android”. c:/xampp/htdocs/android. (sesuaikan dengan direktori
server Anda).

index.php

1 <html>
2 <head>
3 <title>Index Android</title>
4 </head>
5 <body>

6 <h3>Index Android</h3>

7 </body>

8 </html>

connection.php

1 <?php
2
3 /*silakan sesuaikan dengan konfigurasi server Anda*/
4 $conn = mysql_connect('localhost', 'root', 'xxxxx') or
die(mysql_error());
5
$db = mysql_select_db('latihan_android') or die(mysql_error());
6
?>

select_all.php

1 <?php
2
3 /*reply data dalam JSON */
4
5 include('connection.php');
6 $query = 'select * from mahasiswa';

7 $result = mysql_query($query) or die(mysql_error());

8
9 $data = array();

10 while($row = mysql_fetch_object($result)){

11 $data['mahasiswa'][]= $row;

12 }

13 echo json_encode($data);

14 ?>

submit_mahasiswa.php

1 <?php
2
3 /**jika id = 0,maka akan dilakukan insert, jika tidak update berdasarkan id */
4 include('connection.php');

5
6 $id = (int)$_POST['id'];

7 $nim = $_POST['nim'];

8 $nama = $_POST['nama'];

9 $telp = $_POST['telp'];

10 $alamat = $_POST['alamat'];

11
12 $query = 'insert into mahasiswa (nim, nama, telp, alamat) values ("'.$nim.'", "'.$nama.'", "'.$telp.'", "'
13 if($id > 0){
14 $query = 'update mahasiswa set nama = "'.$nama.'", nim = "'.$nim.'", telp = "'.$telp.'", alamat = "'.$a
id = '.$id;
15
}
16
mysql_query($query) or die(mysql_error());
17
18
?>

delete_mahasiswa.php

1 <?php
2
3 /**menghapus mahasiswa berdasarkan id*/
4 include('connection.php');

5 $id = (int)$_GET['id'];

6 $query = 'delete from mahasiswa where id = '.$id;

7 $result = mysql_query($query) or die(mysql_error());

8 if(mysql_affected_rows() > 0){

9 echo 'deleted id = '.$id;

10 }else{

11 echo 'NOT founnd id = '.$id;

12 }

13 ?>

Script PHP sudah selesai dan selanjutnya membuat aplikasi inti yaitu Android. Ada baiknya, sebelum membuat
aplikasi android, kita test dulu apakah script PHP sudah bisa diakses dari emulator.

Caranya mudah, cukup buka browser dari emulator (AVD), dan bukalah
urlhttp://10.0.2.2/android/index.php
10.0.2.2 adalah host default untuk mengakses server local.
Index
Jika direktori dan file nya benar, server aktif dan MySQL aktif, maka tampilannya seperti gambar di atas, berari
emulator sudah dapat mengakses localhost dan kita siap untuk membuat aplikasi Android.

3. Membuat aplikasi Android


Buatlah project Android seperti gambar berikut:
create
Pada project ini, kita membuat aplikasi dengan Min Requirement SDK adalah API 11 (Honeycomb) . Karena di
aplikasi ini memiliki Action Bar (Action Bar hanya tersedia pada API 11 ke atas).

Secara default, Eclipse akan membuat 1 Activity dan 1 layout (MainActivity.java dan activity_main.xml).

a. Membuat object Mahasiswa


Yang pertama kita lakukan adalah membuat object Mahasiswa. Yha…. Mahasiswa, karena table yang dibuat
sebelumnya adalah mahasiswa. Class Mahasiswa sangat membantu kita memanipulasi object. Salah satunya
adalah konsep Object Relational Mapping (ORM) yang menggunakan object yang sama untuk memetakan table
pada database.

Mahasiswa.java

1 package org.pizaini.mahasiswaonline.entities;
2
3 public class Mahasiswa {
4 private Integer id;

5 private String nim;

6 private String nama;

7 private String telp;

8 private String alamat;

9
10 public Mahasiswa() {
11 super();
12 }
13
14 public Mahasiswa(Integer id, String nim, String nama, String telp,

15 String alamat) {

16 super();

17 this.id = id;

18 this.nim = nim;

19 this.nama = nama;

20 this.telp = telp;

21 this.alamat = alamat;

22 }

23
24 public Integer getId() {

25 return id;

26 }

27
28 public void setId(Integer id) {

29 this.id = id;

30 }

31
32 public String getNim() {

33 return nim;

34 }

35
36 public void setNim(String nim) {

37 this.nim = nim;

38 }

39
40 public String getNama() {

41 return nama;

42 }

43
44 public void setNama(String nama) {
this.nama = nama;
45
}
46
47
public String getTelp() {
48
return telp;
49
}
50
51
public void setTelp(String telp) {
52
this.telp = telp;
53
}
54
55 public String getAlamat() {
56 return alamat;
57 }

58
59 public void setAlamat(String alamat) {

60 this.alamat = alamat;

61 }

62
63 }

64

b. Membuat class ServerRequest


Class ini akan kita gunakan berkomunikasi / melakukan request ke server. Pada class ini, kita membuat dua
buah request, yaitu GET dan POST.

ServerRequest.java

1 package org.pizaini.mahasiswaonline.server;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;

5 import java.io.InputStream;

6 import java.io.InputStreamReader;

7 import java.util.ArrayList;

8 import java.util.List;

9 import org.apache.http.HttpEntity;

10 import org.apache.http.HttpResponse;

11 import org.apache.http.HttpStatus;

12 import org.apache.http.NameValuePair;

13 import org.apache.http.StatusLine;

14 import org.apache.http.client.HttpClient;

15 import org.apache.http.client.entity.UrlEncodedFormEntity;

16 import org.apache.http.client.methods.HttpGet;

17 import org.apache.http.client.methods.HttpPost;

18 import org.apache.http.impl.client.DefaultHttpClient;

19 import org.apache.http.message.BasicNameValuePair;

20 import org.apache.http.params.BasicHttpParams;

21 import org.apache.http.params.HttpConnectionParams;

22 import org.apache.http.params.HttpParams;

23 import org.pizaini.mahasiswaonline.entities.Mahasiswa;

24 import android.util.Log;

25
26 public class ServerRequest {

27 private final static String TAG = "ServerRequest";

28 private final String serverUri = "http://10.0.2.2/android";

29 public static final String urlSelectAll = "select_all.php";


30 public static final String urlDelete = "delete_mahasiswa.php";
31 public static final String urlSubmit = "submit_mahasiswa.php";
32
33 public ServerRequest() {

34 super();

35 }

36
37 /** Mengirimkan GET request */

38 public String sendGetRequest(String reqUrl){

39 HttpClient httpClient;

40 HttpGet httpGet = new HttpGet(serverUri+"/"+reqUrl);

41 InputStream is = null;

42 StringBuilder stringBuilder = new StringBuilder();

43 try {

44 HttpParams params = new BasicHttpParams();

45 HttpConnectionParams.setConnectionTimeout(params, 3000);

46 HttpConnectionParams.setSoTimeout(params, 3000);

47 httpClient = new DefaultHttpClient(params);

48 Log.d(TAG, "executing...");

49 HttpResponse httpResponse = httpClient.execute(httpGet);

50 StatusLine status = httpResponse.getStatusLine();

51 if(status.getStatusCode() == HttpStatus.SC_OK && httpResponse !=


null){
52
/** mengambil response string dari server */
53
HttpEntity httpEntity = httpResponse.getEntity();
54
is = httpEntity.getContent();
55
BufferedReader reader = new BufferedReader(new
56 InputStreamReader(is));

57 String line = null;

58 while((line = reader.readLine()) != null){

59 stringBuilder.append(line+"\n");

60 }

61 is.close();

62 }

63 } catch (Exception e) {

64 Log.d(TAG, e.getMessage());

65 }

66
67 return stringBuilder.toString();

68 }

69
70 /** Mengirimkan POST request */

71 public int sendPostRequest(Mahasiswa mahasiswa, String url){

72 int replyCode = 99;

73 HttpClient httpClient;
HttpPost post = new HttpPost(this.serverUri+"/"+url);
74 /** menambahkan parameter ke dalam request */
75 List<NameValuePair> value = new ArrayList<NameValuePair>();
76 value.add(new BasicNameValuePair("id",
mahasiswa.getId().toString()));
77
value.add(new BasicNameValuePair("nim", mahasiswa.getNim()));
78
value.add(new BasicNameValuePair("nama", mahasiswa.getNama()));
79
value.add(new BasicNameValuePair("telp", mahasiswa.getTelp()));
80
value.add(new BasicNameValuePair("alamat", mahasiswa.getAlamat()));
81
82
try {
83
HttpParams params = new BasicHttpParams();
84
HttpConnectionParams.setConnectionTimeout(params, 3000);
85
HttpConnectionParams.setSoTimeout(params, 3000);
86
httpClient = new DefaultHttpClient(params);
87
post.setEntity(new UrlEncodedFormEntity(value));
88
Log.d(TAG, "executing post...");
89
HttpResponse httpResponse = httpClient.execute(post);
90
StatusLine status = httpResponse.getStatusLine();
91
if(status.getStatusCode() == HttpStatus.SC_OK){
92
Log.d(TAG, "submitted sucessfully...");
93
replyCode = status.getStatusCode();
94
}
95
} catch (IOException e) {
96
Log.d(TAG, e.getMessage());
97
}
98
return replyCode;
99
}
100
}

MainActivity akan kita gunakan untuk menampilkan ListView nama mahasiswa dan NIM. Seperti berikut:
ListView
c. Ubah layout activity_main.xml
1 <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
2
xmlns:tools="http://schemas.android.com/tools"
3
android:layout_width="match_parent"
4
android:layout_height="match_parent"
5
tools:context=".MainActivity" >
6
7
<ListView
8
android:id="@+id/listview_main"
9
android:layout_width="match_parent"
10
android:layout_height="wrap_content"
11
android:dividerHeight="1dp"
12
android:layout_margin="5dp" >
13
</ListView>
14
15
</RelativeLayout>
d. Tambahkan layout baru list_row.xml
Layout ini adalah custom ListView agar dapat menampilhan Nama dan NIM mahasiswa dalam ListView.

1 <?xml version="1.0" encoding="utf-8"?>


2 <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
3
android:layout_width="match_parent"
4
android:layout_height="match_parent"
5
android:layout_margin="5dp"
6
>
7
8
<TextView
9
android:id="@+id/text_nama"
10
android:layout_width="wrap_content"
11
android:layout_height="wrap_content"
12
android:layout_alignParentLeft="true"
13
android:layout_alignParentTop="true"
14
android:text="@string/app_name"
15
android:typeface="sans"
16
android:textColor="@android:color/background_dark"
17
android:textAppearance="?android:attr/textAppearanceLarge" />
18
19
<TextView
20
android:id="@+id/text_nim"
21
android:layout_width="wrap_content"
22
android:layout_height="wrap_content"
23
android:layout_alignParentLeft="true"
24
android:text="@string/app_name"
25
android:textColor="@android:color/background_dark"
26
android:layout_below="@+id/text_nama"/>
27
28
</RelativeLayout>

e. Membuat List Adapter


Untuk menampilkan custom ListView, kita membutuhkan sebuah adapter yang inherit kepada BaseAdapter.
ListAdapterMahasiswa juga meng-implements Filterable yang berguna saat melakukan pencarian. LisBerikut
adalah potongan source code nya:

ListAdapterMahasiswa.java

1 package org.pizaini.mahasiswaonline.entities;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import org.pizaini.mahasiswaonline.R;

6 import android.content.Context;

7 import android.view.LayoutInflater;

8 import android.view.View;

9 import android.view.ViewGroup;
10 import android.widget.BaseAdapter;
11 import android.widget.Filter;
12 import android.widget.Filterable;
13 import android.widget.TextView;

14
15 public class ListAdapterMahasiswa extends BaseAdapter implements Filterable{

16 private Context context;

17 private List<Mahasiswa> list, filterd;

18
19 public ListAdapterMahasiswa(Context context, List<Mahasiswa> list) {

20 this.context = context;

21 this.list = list;

22 this.filterd = this.list;

23 }

24
25 @Override

26 public int getCount() {

27 return filterd.size();

28 }

29
30 @Override

31 public Object getItem(int position) {

32 return filterd.get(position);

33 }

34
35 @Override

36 public long getItemId(int position) {

37 return position;

38 }

39
40 @Override

41 public View getView(int position, View convertView, ViewGroup parent) {

42 if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(this.context);
43
convertView = inflater.inflate(R.layout.list_row, null);
44
}
45
Mahasiswa mhs = filterd.get(position);
46
TextView textNama = (TextView) convertView.findViewById(R.id.text_nama);
47
textNama.setText(mhs.getNama());
48
49
TextView textNim = (TextView) convertView.findViewById(R.id.text_nim);
50
textNim.setText(mhs.getNim());
51
52
return convertView;
53
}
54
55 @Override
56 public Filter getFilter() {
57 MahasiswaFilter filter = new MahasiswaFilter();

58 return filter;

59 }

60
61 /** Class filter untuk melakukan filter (pencarian) */

62 private class MahasiswaFilter extends Filter{

63
64 @Override

65 protected FilterResults performFiltering(CharSequence constraint) {

66 List<Mahasiswa> filteredData = new ArrayList<Mahasiswa>();

67 FilterResults result = new FilterResults();

68 String filterString = constraint.toString().toLowerCase();

69 for(Mahasiswa mhs: list){

70 if(mhs.getNama().toLowerCase().contains(filterString) ||
mhs.getNim().toLowerCase().contains(filterString)){
71
filteredData.add(mhs);
72
}
73
}
74
result.count = filteredData.size();
75
result.values = filteredData;
76
return result;
77
}
78
79
@Override
80
protected void publishResults(CharSequence constraint, FilterResults results) {
81
filterd = (List<Mahasiswa>) results.values;
82
notifyDataSetChanged();
83
}
84
85
}
86
87
}
88

f. Edit MainActivity.java
MainActivity adalah class utama memiliki fitur:

- Menampilkan custom ListView

- Memiliki Option Menu yang ditampilkan pada Action Bar (Search dan New)

- Search View untuk melakukan filter (pencarian)

- ListView yang dapat diklik (clickable ListView)

- ListView yang dapat di long-click. Long clik akan menampilkan Contextual Action Bar (CAB) untuk Edit dan
Delete.

Pada saat MainActivity dijalankan, Activity akan melakukan request ke server melalui AsyncTask.
1 ...
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);

6 setContentView(R.layout.activity_main);

7 ...

8 ...

9
10 /** melakukan load data melalui AsyncTask */

11 new MainActivityAsync().execute("load");

12 }

13
14 ...

Activity akan memanggil class ServerRequest untuk mengirimkan GET requets.

1 ...
2
3 private class MainActivityAsync extends AsyncTask<String, Void, String>{
4 ...
5
6 @Override

7 protected String doInBackground(String... params) {

8 ...

9 /** Mengirimkan request ke server dan memproses JSON response */

10 String response =
serverRequest.sendGetRequest(ServerRequest.urlSelectAll);
11
list = processResponse(response);
12
...
13
}
14
15
...
16
}
17
18
...

Response dari request ini adalah JSON (JavaScript Object Notation). Url yang
direquesthttp://10.0.2.2/android/select_all.php. Atau dapat dilihat melalui browser
localhosthttp://localhost/android/select_all.php.
JSON Response:

{"mahasiswa":[
{"id":"29","nim":"2222","nama":"aaaa","telp":"0801","alamat":"Alamat 1"},
{"id":"30","nim":"1111","nama":"bbbb","telp":"0802","alamat":"Alamat 2"},
{"id":"31","nim":"2222","nama":"cccc","telp":"0803","alamat":"Alamat 3"},
{"id":"32","nim":"3333","nama":"dddd","telp":"0804","alamat":"Alamat 4"},
{"id":"33","nim":"1111","nama":"eeee","telp":"0805","alamat":"Alamat 5"},
{"id":"34","nim":"2222","nama":"ffff","telp":"0806","alamat":"Alamat 6"},
{"id":"35","nim":"3333","nama":"gggg","telp":"0807","alamat":"Alamat 7"},
{"id":"36","nim":"4444","nama":"hhhh","telp":"0808","alamat":"Alamat 8"},
{"id":"37","nim":"5555","nama":"iiii","telp":"0809","alamat":"Alamat 9"}
]}
Response JSON ini akan diproses sesuai dengan object nya. Berdasarkan response JSON di atas, terlihat bahwa
object JSON terdiri dari “mahasiswa”. Dan “mahasiswa” memiliki JSON Array.

1 ...
2
3 private List<Mahasiswa> processResponse(String response){
4 List<Mahasiswa> list = new ArrayList<Mahasiswa>();

5 try {

6 JSONObject jsonObj = new JSONObject(response);

7 JSONArray jsonArray = jsonObj.getJSONArray("mahasiswa");

8 Log.d(TAG, "data lengt: "+jsonArray.length());

9 Mahasiswa mhs = null;

10 for(int i = 0; i < jsonArray.length(); i++){

11 JSONObject obj = jsonArray.getJSONObject(i);

12 mhs = new Mahasiswa();

13 mhs.setId(obj.getInt("id"));

14 mhs.setNim(obj.getString("nim"));

15 mhs.setNama(obj.getString("nama"));

16 mhs.setTelp(obj.getString("telp"));

17 mhs.setAlamat(obj.getString("alamat"));

18 list.add(mhs);

19 }

20 } catch (JSONException e) {

21 Log.d(TAG, e.getMessage());

22 }

23 return list;

24 }

25
26 ...

Berikut adalah Source code lengkap MainActivity.java

1 package org.pizaini.mahasiswaonline;
2
3 import java.util.ArrayList;
4 import java.util.List;

5 import org.json.JSONArray;

6 import org.json.JSONException;

7 import org.json.JSONObject;

8 import org.pizaini.mahasiswaonline.entities.ListAdapterMahasiswa;

9 import org.pizaini.mahasiswaonline.entities.Mahasiswa;

10 import org.pizaini.mahasiswaonline.server.ServerRequest;

11 import android.os.AsyncTask;

12 import android.os.Bundle;

13 import android.app.Activity;
14 import android.app.AlertDialog;
15 import android.app.ProgressDialog;
16 import android.app.SearchManager;
17 import android.content.Context;

18 import android.content.DialogInterface;

19 import android.content.Intent;

20 import android.util.Log;

21 import android.view.ActionMode;

22 import android.view.Menu;

23 import android.view.MenuItem;

24 import android.view.View;

25 import android.widget.AdapterView;

26 import android.widget.AdapterView.OnItemClickListener;

27 import android.widget.AdapterView.OnItemLongClickListener;

28 import android.widget.ListView;

29 import android.widget.SearchView;

30 import android.widget.Toast;

31 import android.widget.SearchView.OnQueryTextListener;

32
33 public class MainActivity extends Activity implements OnQueryTextListener{

34 private static final String TAG = "MainActivity";

35 private ListView listView;

36 private ActionMode actionMode;

37 private ActionMode.Callback amCallback;

38 private ProgressDialog progressDialog;

39 private ServerRequest serverRequest;

40 private List<Mahasiswa> list;

41 private ListAdapterMahasiswa adapter;


private Mahasiswa selectedList;
42
43
@Override
44
protected void onCreate(Bundle savedInstanceState) {
45
super.onCreate(savedInstanceState);
46
setContentView(R.layout.activity_main);
47
serverRequest = new ServerRequest();
48
listView = (ListView) findViewById(R.id.listview_main);
49
amCallback = new ActionMode.Callback() {
50
51
@Override
52
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
53
return false;
54
}
55
56
@Override
57
public void onDestroyActionMode(ActionMode mode) {
58 actionMode = null;
59 }
60
61 @Override

62 public boolean onCreateActionMode(ActionMode mode, Menu menu) {

63 getMenuInflater().inflate(R.menu.activity_main_action, menu);

64 return true;

65 }

66
67 @Override

68 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

69 switch(item.getItemId()){

70 case R.id.action_menu_edit:

71 showUpdateForm();

72 break;

73 case R.id.action_menu_delete:

74 delete();

75 break;

76 }

77 mode.finish();

78 return false;

79 }

80 };

81 list = new ArrayList<Mahasiswa>();

82 /** melakukan load data melalui AsyncTask */

83 new MainActivityAsync().execute("load");

84 }

85
86 private void showUpdateForm(){

87 Intent in = new Intent(getApplicationContext(), FormMahasiswa.class);

88 in.putExtra("id", selectedList.getId().toString());
in.putExtra("nim", selectedList.getNim());
89
in.putExtra("nama", selectedList.getNama());
90
in.putExtra("telp", selectedList.getTelp());
91
in.putExtra("alamat", selectedList.getAlamat());
92
startActivity(in);
93
}
94
95
private void delete(){
96
AlertDialog.Builder builder = new AlertDialog.Builder(this);
97
builder.setMessage("Delete "+selectedList.getNama()+" ?");
98
builder.setTitle("Delete");
99
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
10
0 public void onClick(DialogInterface dialog, int which) {
10 new MainActivityAsync().execute("delete");
1 list.remove(list.indexOf(selectedList));
10 Toast.makeText(getApplicationContext(), "deleted", Toast.LENGTH_SHORT).show();
2
}
10
3 });

10 builder.setNegativeButton("No", new DialogInterface.OnClickListener() {


4 public void onClick(DialogInterface dialog, int which) {
10 dialog.cancel();
5
}
10
6 });

10 AlertDialog alert = builder.create();


7
alert.setIcon(android.R.drawable.ic_menu_delete);
10
alert.show();
8
}
10
9 @Override
11 public boolean onCreateOptionsMenu(Menu menu) {
0
getMenuInflater().inflate(R.menu.activity_main, menu);
11
1 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

11 SearchView searchView = (SearchView)


2 menu.findItem(R.id.option_menu_search).getActionView();

11 searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
3 searchView.setIconifiedByDefault(false);
11 searchView.setOnQueryTextListener(this);
4
searchView.setQueryHint("nama atau nim");
11
5
11 return true;
6
}
11
7
11 @Override
8 public boolean onOptionsItemSelected(MenuItem item) {
11 switch(item.getItemId()){
9
case R.id.option_menu_new:
12
0 Intent in = new Intent(getApplicationContext(), FormMahasiswa.class);
12 startActivity(in);
1
break;
12
2 }

12 return super.onOptionsItemSelected(item);
3 }
12
4
private List<Mahasiswa> processResponse(String response){
12
5 List<Mahasiswa> list = new ArrayList<Mahasiswa>();
12 try {
6
JSONObject jsonObj = new JSONObject(response);
12
7 JSONArray jsonArray = jsonObj.getJSONArray("mahasiswa");
Log.d(TAG, "data lengt: "+jsonArray.length());
12
8 Mahasiswa mhs = null;
12
9 for(int i = 0; i < jsonArray.length(); i++){
13 JSONObject obj = jsonArray.getJSONObject(i);
0
mhs = new Mahasiswa();
13
1 mhs.setId(obj.getInt("id"));

13 mhs.setNim(obj.getString("nim"));
2 mhs.setNama(obj.getString("nama"));
13 mhs.setTelp(obj.getString("telp"));
3
mhs.setAlamat(obj.getString("alamat"));
13
4 list.add(mhs);

13 }
5
} catch (JSONException e) {
13
Log.d(TAG, e.getMessage());
6
}
13
7 return list;
13 }
8
13
9 private void populateListView(){

14 adapter = new ListAdapterMahasiswa(getApplicationContext(), list);


0
listView.setAdapter(adapter);
14
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
1
14
2 @Override
14 public boolean onItemLongClick(AdapterView<?> adapterView, View v, int pos, long id) {
3
if(actionMode != null){
14
4 return false;

14 }
5 actionMode = startActionMode(amCallback);
14 v.setSelected(true);
6
selectedList = (Mahasiswa) adapter.getItem(pos);
14
7 return true;
14 }
8
14
9 });

15
0 listView.setOnItemClickListener(new OnItemClickListener() {
15
1
@Override
15
2 public void onItemClick(AdapterView<?> adapterView, View v, int pos,
15 long id) {
3
selectedList = (Mahasiswa) adapter.getItem(pos);
15
4 Intent in = new Intent(getApplicationContext(), DetailMahasiswa.class);

15 in.putExtra("id", selectedList.getId().toString());
5 in.putExtra("nim", selectedList.getNim());
15 in.putExtra("nama", selectedList.getNama());
6
in.putExtra("telp", selectedList.getTelp());
15
7 in.putExtra("alamat", selectedList.getAlamat());
15 startActivity(in);
8
}
15
9 });

16 }
0
16 private class MainActivityAsync extends AsyncTask<String, Void, String>{
1
16
2 @Override

16 protected void onPreExecute() {


3
progressDialog = new ProgressDialog(MainActivity.this);
16
progressDialog.setMessage("retrieving...");
4
progressDialog.setIndeterminate(false);
16
5 progressDialog.setCancelable(false);
16 progressDialog.show();
6
}
16
7
16 @Override
8
protected String doInBackground(String... params) {
16
if(params[0] == "delete"){
9
serverRequest.sendGetRequest(ServerRequest.urlDelete+"?id="+selectedList.getId().toStrin
17
g());
0
}else{
17
1 /** Mengirimkan request ke server dan memproses JSON response */
17 String response = serverRequest.sendGetRequest(ServerRequest.urlSelectAll);
2
list = processResponse(response);
17
3 }

17 return null;
4 }
17
5
@Override
17
6 protected void onPostExecute(String result) {
17 progressDialog.dismiss();
7
runOnUiThread(new Runnable() {
17
8 @Override

17 public void run() {


9 populateListView();
18 }
0
});
18
1 }
18
2
}
18
3
18 @Override
4 public boolean onQueryTextChange(String newText) {
18
5 adapter.getFilter().filter(newText);
18 return true;
6
}
18
7
18 @Override
8 public boolean onQueryTextSubmit(String query) {
18 return false;
9
}
19
0
19 }
1
19
2
19
3
19
4
19
5
19
6
19
7
19
8
19
9
20
0
20
1
20
2
20
3
20
4
20
5
20
6
20
7
20
8
20
9
21
0
21
1
21
2
21
3
21
4
21
5
21
6
21
7
21
8
21
9
22
0
22
1
22
2
22
3
22
4
22
5
22
6
22
7
22
8
22
9
23
0
23
1
23
2
23
3
23
4
23
5
23
6
23
7
23
8
23
9
24
0
24
1
24
2
24
3
24
4
24
5
24
6

g. Membuat Form Mahasiswa


Buatlah sebuah activity (FormMahasiswa.java) dengan layout activity_form_mahasiswa.xml. Layout ini terdiri
dari TextView dan EditText untuk input data Mahasiswa (nama, nim, telp dan alamat). Form Mahasiswa kita
gunakan untuk insert dan delete.

activity_form_mahasiswa.xml

1 <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
2
xmlns:tools="http://schemas.android.com/tools"
3
android:layout_width="match_parent"
4
android:layout_height="match_parent"
5
android:orientation="vertical"
6
android:layout_margin="5dp"
7
tools:context=".FormMahasiswa" >
8
9
<TextView
10
android:id="@+id/textView1"
11
android:layout_width="wrap_content"
12
android:layout_height="wrap_content"
13
android:text="@string/tv_nim" />
14
15
<EditText
16
android:id="@+id/add_new_nim"
17
android:layout_width="match_parent"
18
android:layout_height="wrap_content"
19
android:hint="@string/hint_nim"
20
android:inputType="number"
21
android:layout_marginBottom="30dp"
22
android:ems="10" >
23
<requestFocus />
24
</EditText>
25
26
<TextView
27
android:id="@+id/textView2"
28
android:layout_width="wrap_content"
29
android:layout_height="wrap_content"
30
android:text="@string/tv_nama" />
31
32
33 <EditText
34 android:id="@+id/add_new_nama"
35 android:layout_width="match_parent"

36 android:layout_height="wrap_content"

37 android:hint="@string/hint_nama"

38 android:layout_marginBottom="30dp"

39 android:ems="10" />

40
41 <TextView

42 android:id="@+id/textView3"

43 android:layout_width="wrap_content"

44 android:layout_height="wrap_content"

45 android:text="@string/tv_telp" />

46
47 <EditText

48 android:id="@+id/add_new_telp"

49 android:layout_width="match_parent"

50 android:layout_height="wrap_content"

51 android:hint="@string/hint_telp"

52 android:inputType="textPhonetic"

53 android:layout_marginBottom="30dp"

54 android:ems="10" />

55
56 <TextView

57 android:id="@+id/textView4"

58 android:layout_width="wrap_content"

59 android:layout_height="wrap_content"

60 android:text="@string/tv_alamat" />

61
62 <EditText

63 android:id="@+id/add_new_alamat"
android:layout_width="match_parent"
64
android:layout_height="wrap_content"
65
android:ems="10"
66
android:minHeight="80dp"
67
android:hint="@string/hint_alamat"
68
android:inputType="textPostalAddress" />
69
70
</LinearLayout>

FormMahasiswa.java
Berikut adalah activity untuk menampilkan form Mahasiswa.
1 package org.pizaini.mahasiswaonline;
2
3 import org.apache.http.HttpStatus;
4 import org.pizaini.mahasiswaonline.entities.Mahasiswa;
5 import org.pizaini.mahasiswaonline.server.ServerRequest;
6
7 import android.os.AsyncTask;

8 import android.os.Bundle;

9 import android.app.ActionBar;

10 import android.app.Activity;

11 import android.app.ProgressDialog;

12 import android.content.Intent;

13 import android.view.Menu;

14 import android.view.MenuItem;

15 import android.widget.EditText;

16 import android.widget.Toast;

17
18 public class FormMahasiswa extends Activity {

19 private EditText textNim, textNama, textTelp, textAlamat;

20 private ProgressDialog progressDialog;

21 private ServerRequest server;

22 private int replyCode;

23 private Mahasiswa mahasiswa;

24
25 @Override

26 protected void onCreate(Bundle savedInstanceState) {

27 super.onCreate(savedInstanceState);

28 setContentView(R.layout.activity_form_mahasiswa);

29 initView();

30 server = new ServerRequest();

31 ActionBar actionBar = getActionBar();

32 actionBar.setDisplayHomeAsUpEnabled(true);

33 mahasiswa = new Mahasiswa();

34 if(getIntent().hasExtra("id")){
String id = getIntent().getStringExtra("id");
35
String nim = getIntent().getStringExtra("nim");
36
String nama = getIntent().getStringExtra("nama");
37
String telp = getIntent().getStringExtra("telp");
38
String alamat = getIntent().getStringExtra("alamat");
39
textNim.setText(nim);
40
textNama.setText(nama);
41
textTelp.setText(telp);
42
textAlamat.setText(alamat);
43
mahasiswa.setId(Integer.valueOf(id));
44
}else{
45
mahasiswa.setId(0);
46
}
47
}
48
49 private void initView(){
50 textNim = (EditText) findViewById(R.id.add_new_nim);
51 textNama = (EditText) findViewById(R.id.add_new_nama);

52 textTelp = (EditText) findViewById(R.id.add_new_telp);

53 textAlamat = (EditText) findViewById(R.id.add_new_alamat);

54 }

55
56 @Override

57 public boolean onCreateOptionsMenu(Menu menu) {

58 getMenuInflater().inflate(R.menu.form_mahasiswa, menu);

59 return true;

60 }

61
62 private void goToMainActivity(){

63 Intent in = new Intent(getApplicationContext(), MainActivity.class);

64 in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

65 startActivity(in);

66 }

67
68 @Override

69 public boolean onOptionsItemSelected(MenuItem item) {

70 switch(item.getItemId()){

71 case android.R.id.home:

72 goToMainActivity();

73 break;

74
75 case R.id.option_menu_save:

76 if(textNim.getText().toString().trim().isEmpty() ||
textNama.getText().toString().trim().isEmpty()){
77
Toast.makeText(getApplicationContext(), "NIM dan Nama tidak boleh kosong",
78 Toast.LENGTH_SHORT).show();

79 }else{

80 new FormMahasiswaAsync().execute();

81 }

82 break;

83 }

84 return super.onOptionsItemSelected(item);

85 }

86
87 private void sendRequest(){

88 String nim = textNim.getText().toString();

89 String nama = textNama.getText().toString();

90 String telp = textTelp.getText().toString();

91 String alamat = textAlamat.getText().toString();


mahasiswa.setNim(nim);
92 mahasiswa.setNama(nama);
93 mahasiswa.setTelp(telp);
94 mahasiswa.setAlamat(alamat);
95
96 /**Mengirimkan POST reques*/

97
98 replyCode = server.sendPostRequest(mahasiswa, ServerRequest.urlSubmit);

99 }

100
101 private class FormMahasiswaAsync extends AsyncTask<String, String, String>{

102 @Override

103 protected void onPreExecute() {

104 progressDialog = new ProgressDialog(FormMahasiswa.this);

105 progressDialog.setMessage("saving data...");

106 progressDialog.setIndeterminate(false);

107 progressDialog.setCancelable(false);

108 progressDialog.show();

109 }

110 @Override

111 protected String doInBackground(String... params) {

112 sendRequest();

113 return null;

114 }

115 @Override

116 protected void onPostExecute(String result) {

117 progressDialog.dismiss();

118 if(replyCode == HttpStatus.SC_OK){

119 goToMainActivity();

120 }else{

121 Toast.makeText(getApplicationContext(), "save data problem", Toast.LENGTH_SHORT).show();

122 }
}
123
124
}
125
126
}
127
128

h. Membuat Detail Mahasiswa


Detail Mahasiswa berfungsi untuk menampilkan data lengkap. Karena pada ListView yang ditampilkan hanya
NIM dan Nama.

activity_detail_mahasiswa.xml

1 </p>
2 <LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"

7 android:orientation="vertical"

8 android:layout_margin="5dp"

9 tools:context=".DetailMahasiswa" >

10
11 <TextView

12 android:id="@+id/textView1"

13 android:layout_width="wrap_content"

14 android:layout_height="wrap_content"

15 android:text="@string/tv_nim" />

16
17 <EditText

18 android:id="@+id/add_new_nim"

19 android:layout_width="match_parent"

20 android:layout_height="wrap_content"

21 android:hint="@string/hint_nim"

22 android:enabled="false"

23 android:layout_marginBottom="30dp"

24 android:ems="10" >

25 <requestFocus />

26 </EditText>

27
28 <TextView

29 android:id="@+id/textView2"

30 android:layout_width="wrap_content"

31 android:layout_height="wrap_content"

32 android:text="@string/tv_nama" />

33
<EditText
34
android:id="@+id/add_new_nama"
35
android:layout_width="match_parent"
36
android:layout_height="wrap_content"
37
android:hint="@string/hint_nama"
38
android:enabled="false"
39
android:layout_marginBottom="30dp"
40
android:ems="10" />
41
42
<TextView
43
android:id="@+id/textView3"
44
android:layout_width="wrap_content"
45
android:layout_height="wrap_content"
46
android:text="@string/tv_telp" />
47
48 <EditText
49 android:id="@+id/add_new_telp"
50 android:layout_width="match_parent"

51 android:layout_height="wrap_content"

52 android:hint="@string/hint_telp"

53 android:layout_marginBottom="30dp"

54 android:enabled="false"

55 android:ems="10" />

56
57 <TextView

58 android:id="@+id/textView4"

59 android:layout_width="wrap_content"

60 android:layout_height="wrap_content"

61 android:text="@string/tv_alamat" />

62
63 <EditText

64 android:id="@+id/add_new_alamat"

65 android:layout_width="match_parent"

66 android:layout_height="wrap_content"

67 android:ems="10"

68 android:minHeight="80dp"

69 android:enabled="false"

70 android:hint="@string/hint_alamat"

71 android:inputType="textPostalAddress" />

72
73 </LinearLayout>

Activity DetailMahasiswa berguna untuk menampilkan data mahasiswa dengan


layout activity_detail_mahasiswa.xml.

1 package org.pizaini.mahasiswaonline;
2
3 import org.pizaini.mahasiswaonline.entities.Mahasiswa;
4 import org.pizaini.mahasiswaonline.server.ServerRequest;
5 import android.os.AsyncTask;

6 import android.os.Bundle;

7 import android.app.ActionBar;

8 import android.app.Activity;

9 import android.app.AlertDialog;

10 import android.content.DialogInterface;

11 import android.content.Intent;

12 import android.view.Menu;

13 import android.view.MenuItem;

14 import android.widget.EditText;

15 import android.widget.Toast;
16
17 public class DetailMahasiswa extends Activity {
18 private EditText textNim, textNama, textTelp, textAlamat;
19 private Mahasiswa mahasiswa;

20 private ServerRequest server;

21
22 @Override

23 protected void onCreate(Bundle savedInstanceState) {

24 super.onCreate(savedInstanceState);

25 setContentView(R.layout.activity_detail_mahasiswa);

26 mahasiswa = new Mahasiswa();

27 server = new ServerRequest();

28 initView();

29 ActionBar actionBar = getActionBar();

30 actionBar.setDisplayHomeAsUpEnabled(true);

31 }

32
33 private void initView(){

34 textNim = (EditText) findViewById(R.id.add_new_nim);

35 textNama = (EditText) findViewById(R.id.add_new_nama);

36 textTelp = (EditText) findViewById(R.id.add_new_telp);

37 textAlamat = (EditText) findViewById(R.id.add_new_alamat);

38
39 String id = getIntent().getStringExtra("id");

40 String nim = getIntent().getStringExtra("nim");

41 String nama = getIntent().getStringExtra("nama");

42 String telp = getIntent().getStringExtra("telp");

43 String alamat = getIntent().getStringExtra("alamat");

44
45 textNim.setText(nim);

46 textNama.setText(nama);

47 textTelp.setText(telp);
textAlamat.setText(alamat);
48
49
mahasiswa.setId(Integer.valueOf(id));
50
mahasiswa.setNim(nim);
51
mahasiswa.setNama(nama);
52
mahasiswa.setTelp(telp);
53
mahasiswa.setAlamat(alamat);
54
}
55
56
@Override
57
public boolean onCreateOptionsMenu(Menu menu) {
58
getMenuInflater().inflate(R.menu.activity_main_action, menu);
59
return true;
60 }
61
62 @Override
63 public boolean onOptionsItemSelected(MenuItem item) {

64 switch(item.getItemId()){

65 case android.R.id.home:

66 goToMainActivity();

67 break;

68
69 case R.id.action_menu_edit:

70 Intent in = new Intent(getApplicationContext(), FormMahasiswa.class);

71 in.putExtra("id", mahasiswa.getId().toString());

72 in.putExtra("nim", mahasiswa.getNim());

73 in.putExtra("nama", mahasiswa.getNama());

74 in.putExtra("telp", mahasiswa.getTelp());

75 in.putExtra("alamat", mahasiswa.getAlamat());

76 startActivity(in);

77 break;

78
79 case R.id.action_menu_delete:

80 delete();

81 break;

82 }

83 return super.onOptionsItemSelected(item);

84 }

85
86 private void goToMainActivity(){

87 Intent in = new Intent(getApplicationContext(), MainActivity.class);

88 in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

89 startActivity(in);

90 }

91
private void delete(){
92
AlertDialog.Builder builder = new AlertDialog.Builder(this);
93
builder.setMessage("Delete "+mahasiswa.getNama()+" ?");
94
builder.setTitle("Delete");
95
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
96
public void onClick(DialogInterface dialog, int which) {
97
new DetailMahasiswaAsync().execute();
98
Toast.makeText(getApplicationContext(), "deleted", Toast.LENGTH_SHORT).show();
99
}
100
});
101
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
102
public void onClick(DialogInterface dialog, int which) {
103
dialog.cancel();
104 }
105 });
106 AlertDialog alert = builder.create();
107 alert.setIcon(android.R.drawable.ic_menu_delete);

108 alert.show();

109 }

110 private class DetailMahasiswaAsync extends AsyncTask<String, String, String>{

111
112 @Override

113 protected String doInBackground(String... params) {

114 server.sendGetRequest(ServerRequest.urlDelete+"?id="+mahasiswa.getId().toString());

115 return null;

116 }

117
118 @Override

119 protected void onPostExecute(String result) {

120 Intent in = new Intent(getApplicationContext(), MainActivity.class);

121 in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

122 startActivity(in);

123 }

124
125 }

126
127 }

128
129

i. Menambahkan Permission
Tambahkan permission ada AndroidManifest.xml

1 <uses-permission
android:name="android.permission.INTERNET" />

Berikut adalah screenshot aplikasinya:


Main Activity

Show Contextual Action Bar (CAD) on long-press List View


Form Mahasiswa

Detail Mahasiswa