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:
- Shared preferences. Terdiri dari key dan value data. Model ini biasanya untuk menyimpan settingan (pengaturan) sebuah aplikasi.
- 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
- 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:
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:OK….. langsung saja
1. Membuat database MySQL
Database: latihan_android
Table: mahasiswa (id, nim, nama, telp, alamat)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| create database latihan_android; use latihan_android; CREATE TABLE IF NOT EXISTS `mahasiswa` ( `id` int (11) NOT NULL AUTO_INCREMENT, `nim` varchar (11) NOT NULL , `nama` varchar (100) NOT NULL , `telp` varchar (50) NOT NULL , `alamat` varchar (255) NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ; -- -- Dumping data for table `mahasiswa` -- INSERT INTO `mahasiswa` ( `nim`, `nama`, `telp`, `alamat`) VALUES ( '2222' , 'aaaa' , '0801' , 'Alamat 1' ), ( '1111' , 'bbbb' , '0802' , 'Alamat 2' ), ( '2222' , 'cccc' , '0803' , 'Alamat 3' ), ( '3333' , 'dddd' , '0804' , 'Alamat 4' ), ( '1111' , 'eeee' , '0805' , 'Alamat 5' ), ( '2222' , 'ffff' , '0806' , 'Alamat 6' ), ( '3333' , 'gggg' , '0807' , 'Alamat 7' ), ( '4444' , 'hhhh' , '0808' , 'Alamat 8' ), ( '5555' , 'iiii' , '0809' , 'Alamat 9' ); |
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
2
3
4
5
6
7
8
| < html > < head > < title >Index Android</ title > </ head > < body > < h3 >Index Android</ h3 > </ body > </ html > |
connection.php
1
2
3
4
5
6
|
/*silakan sesuaikan dengan konfigurasi server Anda*/ $conn = mysql_connect( 'localhost' , 'root' , 'xxxxx' ) or die (mysql_error()); $db = mysql_select_db( 'latihan_android' ) or die (mysql_error()); ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/*reply data dalam JSON */ include ( 'connection.php' ); $query = 'select * from mahasiswa' ; $result = mysql_query( $query ) or die (mysql_error()); $data = array (); while ( $row = mysql_fetch_object( $result )){ $data [ 'mahasiswa' ][]= $row ; } echo json_encode( $data ); ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/**jika id = 0,maka akan dilakukan insert, jika tidak update berdasarkan id */ include ( 'connection.php' ); $id = (int) $_POST [ 'id' ]; $nim = $_POST [ 'nim' ]; $nama = $_POST [ 'nama' ]; $telp = $_POST [ 'telp' ]; $alamat = $_POST [ 'alamat' ]; $query = 'insert into mahasiswa (nim, nama, telp, alamat) values ("' . $nim . '", "' . $nama . '", "' . $telp . '", "' . $alamat . '")' ; if ( $id > 0){ $query = 'update mahasiswa set nama = "' . $nama . '", nim = "' . $nim . '", telp = "' . $telp . '", alamat = "' . $alamat . '" where id = ' . $id ; } mysql_query( $query ) or die (mysql_error()); ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**menghapus mahasiswa berdasarkan id*/ include ( 'connection.php' ); $id = (int) $_GET [ 'id' ]; $query = 'delete from mahasiswa where id = ' . $id ; $result = mysql_query( $query ) or die (mysql_error()); if (mysql_affected_rows() > 0){ echo 'deleted id = ' . $id ; } else { echo 'NOT founnd id = ' . $id ; } ?> |
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 url http://10.0.2.2/android/index.php
10.0.2.2 adalah host default untuk mengakses server local.
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 AndroidBuatlah project Android seperti gambar berikut:
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 Object Relational Mapping (ORM) juga menggunakan
object yang sama untuk memetakan table pada database.
Mahasiswa.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| package org.pizaini.mahasiswaonline.entities; public class Mahasiswa { private Integer id; private String nim; private String nama; private String telp; private String alamat; public Mahasiswa() { super (); } public Mahasiswa(Integer id, String nim, String nama, String telp, String alamat) { super (); this .id = id; this .nim = nim; this .nama = nama; this .telp = telp; this .alamat = alamat; } public Integer getId() { return id; } public void setId(Integer id) { this .id = id; } public String getNim() { return nim; } public void setNim(String nim) { this .nim = nim; } public String getNama() { return nama; } public void setNama(String nama) { this .nama = nama; } public String getTelp() { return telp; } public void setTelp(String telp) { this .telp = telp; } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this .alamat = alamat; } } |
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| package org.pizaini.mahasiswaonline.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.StatusLine; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.pizaini.mahasiswaonline.entities.Mahasiswa; import android.util.Log; public class ServerRequest { private final static String TAG = "ServerRequest" ; public static final String urlSelectAll = "select_all.php" ; public static final String urlDelete = "delete_mahasiswa.php" ; public static final String urlSubmit = "submit_mahasiswa.php" ; public ServerRequest() { super (); } /** Mengirimkan GET request */ public String sendGetRequest(String reqUrl){ HttpClient httpClient; HttpGet httpGet = new HttpGet(serverUri+ "/" +reqUrl); InputStream is = null ; StringBuilder stringBuilder = new StringBuilder(); try { HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 3000 ); HttpConnectionParams.setSoTimeout(params, 3000 ); httpClient = new DefaultHttpClient(params); Log.d(TAG, "executing..." ); HttpResponse httpResponse = httpClient.execute(httpGet); StatusLine status = httpResponse.getStatusLine(); if (status.getStatusCode() == HttpStatus.SC_OK && httpResponse != null ){ /** mengambil response string dari server */ HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(is)); String line = null ; while ((line = reader.readLine()) != null ){ stringBuilder.append(line+ "\n" ); } is.close(); } } catch (Exception e) { Log.d(TAG, e.getMessage()); } return stringBuilder.toString(); } /** Mengirimkan POST request */ public int sendPostRequest(Mahasiswa mahasiswa, String url){ int replyCode = 99 ; HttpClient httpClient; HttpPost post = new HttpPost( this .serverUri+ "/" +url); /** menambahkan parameter ke dalam request */ List new ArrayList value.add( new BasicNameValuePair( "id" , mahasiswa.getId().toString())); value.add( new BasicNameValuePair( "nim" , mahasiswa.getNim())); value.add( new BasicNameValuePair( "nama" , mahasiswa.getNama())); value.add( new BasicNameValuePair( "telp" , mahasiswa.getTelp())); value.add( new BasicNameValuePair( "alamat" , mahasiswa.getAlamat())); try { HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 3000 ); HttpConnectionParams.setSoTimeout(params, 3000 ); httpClient = new DefaultHttpClient(params); post.setEntity( new UrlEncodedFormEntity(value)); Log.d(TAG, "executing post..." ); HttpResponse httpResponse = httpClient.execute(post); StatusLine status = httpResponse.getStatusLine(); if (status.getStatusCode() == HttpStatus.SC_OK){ Log.d(TAG, "submitted sucessfully..." ); replyCode = status.getStatusCode(); } } catch (IOException e) { Log.d(TAG, e.getMessage()); } return replyCode; } } |
MainActivity akan kita gunakan untuk menampilkan ListView nama mahasiswa dan NIM. Seperti berikut:
c. Ubah layout activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".MainActivity" > < ListView android:id = "@+id/listview_main" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:dividerHeight = "1dp" android:layout_margin = "5dp" > </ ListView > </ RelativeLayout > |
Layout ini adalah custom ListView agar dapat menampilhan Nama dan NIM mahasiswa dalam ListView.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
android:layout_width = "match_parent" android:layout_height = "match_parent" android:layout_margin = "5dp" > < TextView android:id = "@+id/text_nama" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_alignParentTop = "true" android:text = "@string/app_name" android:typeface = "sans" android:textColor = "@android:color/background_dark" android:textAppearance = "?android:attr/textAppearanceLarge" /> < TextView android:id = "@+id/text_nim" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:text = "@string/app_name" android:textColor = "@android:color/background_dark" android:layout_below = "@+id/text_nama" /> </ RelativeLayout > |
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
| package org.pizaini.mahasiswaonline.entities; import java.util.ArrayList; import java.util.List; import org.pizaini.mahasiswaonline.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; public class ListAdapterMahasiswa extends BaseAdapter implements Filterable{ private Context context; private List public ListAdapterMahasiswa(Context context, List this .context = context; this .list = list; this .filterd = this .list; } @Override public int getCount() { return filterd.size(); } @Override public Object getItem( int position) { return filterd.get(position); } @Override public long getItemId( int position) { return position; } @Override public View getView( int position, View convertView, ViewGroup parent) { if (convertView == null ){ LayoutInflater inflater = LayoutInflater.from( this .context); convertView = inflater.inflate(R.layout.list_row, null ); } Mahasiswa mhs = filterd.get(position); TextView textNama = (TextView) convertView.findViewById(R.id.text_nama); textNama.setText(mhs.getNama()); TextView textNim = (TextView) convertView.findViewById(R.id.text_nim); textNim.setText(mhs.getNim()); return convertView; } @Override public Filter getFilter() { MahasiswaFilter filter = new MahasiswaFilter(); return filter; } /** Class filter untuk melakukan filter (pencarian) */ private class MahasiswaFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { List new ArrayList FilterResults result = new FilterResults(); String filterString = constraint.toString().toLowerCase(); for (Mahasiswa mhs: list){ if (mhs.getNama().toLowerCase().contains(filterString) || mhs.getNim().toLowerCase().contains(filterString)){ filteredData.add(mhs); } } result.count = filteredData.size(); result.values = filteredData; return result; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { filterd = (List notifyDataSetChanged(); } } } |
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
4
5
6
7
8
9
10
11
12
13
14
| ... @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... ... /** melakukan load data melalui AsyncTask */ new MainActivityAsync().execute( "load" ); } ... |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| ... private class MainActivityAsync extends AsyncTask ... @Override protected String doInBackground(String... params) { ... /** Mengirimkan request ke server dan memproses JSON response */ String response = serverRequest.sendGetRequest(ServerRequest.urlSelectAll); list = processResponse(response); ... } ... } ... |
Response dari request ini adalah JSON (JavaScript Object Notation). Url yang direquest http://10.0.2.2/android/select_all.php. Atau dapat dilihat melalui browser localhost http://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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| ... private List List new ArrayList try { JSONObject jsonObj = new JSONObject(response); JSONArray jsonArray = jsonObj.getJSONArray( "mahasiswa" ); Log.d(TAG, "data lengt: " +jsonArray.length()); Mahasiswa mhs = null ; for ( int i = 0 ; i < jsonArray.length(); i++){ JSONObject obj = jsonArray.getJSONObject(i); mhs = new Mahasiswa(); mhs.setId(obj.getInt( "id" )); mhs.setNim(obj.getString( "nim" )); mhs.setNama(obj.getString( "nama" )); mhs.setTelp(obj.getString( "telp" )); mhs.setAlamat(obj.getString( "alamat" )); list.add(mhs); } } catch (JSONException e) { Log.d(TAG, e.getMessage()); } return list; } ... |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
| package org.pizaini.mahasiswaonline; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.pizaini.mahasiswaonline.entities.ListAdapterMahasiswa; import org.pizaini.mahasiswaonline.entities.Mahasiswa; import org.pizaini.mahasiswaonline.server.ServerRequest; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.util.Log; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SearchView; import android.widget.Toast; import android.widget.SearchView.OnQueryTextListener; public class MainActivity extends Activity implements OnQueryTextListener{ private static final String TAG = "MainActivity" ; private ListView listView; private ActionMode actionMode; private ActionMode.Callback amCallback; private ProgressDialog progressDialog; private ServerRequest serverRequest; private List private ListAdapterMahasiswa adapter; private Mahasiswa selectedList; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); serverRequest = new ServerRequest(); listView = (ListView) findViewById(R.id.listview_main); amCallback = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false ; } @Override public void onDestroyActionMode(ActionMode mode) { actionMode = null ; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { getMenuInflater().inflate(R.menu.activity_main_action, menu); return true ; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()){ case R.id.action_menu_edit: showUpdateForm(); break ; case R.id.action_menu_delete: delete(); break ; } mode.finish(); return false ; } }; list = new ArrayList /** melakukan load data melalui AsyncTask */ new MainActivityAsync().execute( "load" ); } private void showUpdateForm(){ Intent in = new Intent(getApplicationContext(), FormMahasiswa. class ); in.putExtra( "id" , selectedList.getId().toString()); in.putExtra( "nim" , selectedList.getNim()); in.putExtra( "nama" , selectedList.getNama()); in.putExtra( "telp" , selectedList.getTelp()); in.putExtra( "alamat" , selectedList.getAlamat()); startActivity(in); } private void delete(){ AlertDialog.Builder builder = new AlertDialog.Builder( this ); builder.setMessage( "Delete " +selectedList.getNama()+ " ?" ); builder.setTitle( "Delete" ); builder.setPositiveButton( "Yes" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { new MainActivityAsync().execute( "delete" ); list.remove(list.indexOf(selectedList)); Toast.makeText(getApplicationContext(), "deleted" , Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton( "No" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.setIcon(android.R.drawable.ic_menu_delete); alert.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.option_menu_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault( false ); searchView.setOnQueryTextListener( this ); searchView.setQueryHint( "nama atau nim" ); return true ; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.option_menu_new: Intent in = new Intent(getApplicationContext(), FormMahasiswa. class ); startActivity(in); break ; } return super .onOptionsItemSelected(item); } private List List new ArrayList try { JSONObject jsonObj = new JSONObject(response); JSONArray jsonArray = jsonObj.getJSONArray( "mahasiswa" ); Log.d(TAG, "data lengt: " +jsonArray.length()); Mahasiswa mhs = null ; for ( int i = 0 ; i < jsonArray.length(); i++){ JSONObject obj = jsonArray.getJSONObject(i); mhs = new Mahasiswa(); mhs.setId(obj.getInt( "id" )); mhs.setNim(obj.getString( "nim" )); mhs.setNama(obj.getString( "nama" )); mhs.setTelp(obj.getString( "telp" )); mhs.setAlamat(obj.getString( "alamat" )); list.add(mhs); } } catch (JSONException e) { Log.d(TAG, e.getMessage()); } return list; } private void populateListView(){ adapter = new ListAdapterMahasiswa(getApplicationContext(), list); listView.setAdapter(adapter); listView.setOnItemLongClickListener( new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView adapterView, View v, int pos, long id) { if (actionMode != null ){ return false ; } actionMode = startActionMode(amCallback); v.setSelected( true ); selectedList = (Mahasiswa) adapter.getItem(pos); return true ; } }); listView.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View v, int pos, long id) { selectedList = (Mahasiswa) adapter.getItem(pos); Intent in = new Intent(getApplicationContext(), DetailMahasiswa. class ); in.putExtra( "id" , selectedList.getId().toString()); in.putExtra( "nim" , selectedList.getNim()); in.putExtra( "nama" , selectedList.getNama()); in.putExtra( "telp" , selectedList.getTelp()); in.putExtra( "alamat" , selectedList.getAlamat()); startActivity(in); } }); } private class MainActivityAsync extends AsyncTask @Override protected void onPreExecute() { progressDialog = new ProgressDialog(MainActivity. this ); progressDialog.setMessage( "retrieving..." ); progressDialog.setIndeterminate( false ); progressDialog.setCancelable( false ); progressDialog.show(); } @Override protected String doInBackground(String... params) { if (params[ 0 ] == "delete" ){ serverRequest.sendGetRequest(ServerRequest.urlDelete+ "?id=" +selectedList.getId().toString()); } else { /** Mengirimkan request ke server dan memproses JSON response */ String response = serverRequest.sendGetRequest(ServerRequest.urlSelectAll); list = processResponse(response); } return null ; } @Override protected void onPostExecute(String result) { progressDialog.dismiss(); runOnUiThread( new Runnable() { @Override public void run() { populateListView(); } }); } } @Override public boolean onQueryTextChange(String newText) { adapter.getFilter().filter(newText); return true ; } @Override public boolean onQueryTextSubmit(String query) { return false ; } } |
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" android:layout_margin = "5dp" tools:context = ".FormMahasiswa" > < TextView android:id = "@+id/textView1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_nim" /> < EditText android:id = "@+id/add_new_nim" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_nim" android:inputType = "number" android:layout_marginBottom = "30dp" android:ems = "10" > < requestFocus /> </ EditText > < TextView android:id = "@+id/textView2" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_nama" /> < EditText android:id = "@+id/add_new_nama" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_nama" android:layout_marginBottom = "30dp" android:ems = "10" /> < TextView android:id = "@+id/textView3" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_telp" /> < EditText android:id = "@+id/add_new_telp" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_telp" android:inputType = "textPhonetic" android:layout_marginBottom = "30dp" android:ems = "10" /> < TextView android:id = "@+id/textView4" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_alamat" /> < EditText android:id = "@+id/add_new_alamat" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:ems = "10" android:minHeight = "80dp" android:hint = "@string/hint_alamat" android:inputType = "textPostalAddress" /> </ LinearLayout > |
Berikut adalah activity untuk menampilkan form Mahasiswa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
| package org.pizaini.mahasiswaonline; import org.apache.http.HttpStatus; import org.pizaini.mahasiswaonline.entities.Mahasiswa; import org.pizaini.mahasiswaonline.server.ServerRequest; import android.os.AsyncTask; import android.os.Bundle; import android.app.ActionBar; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; public class FormMahasiswa extends Activity { private EditText textNim, textNama, textTelp, textAlamat; private ProgressDialog progressDialog; private ServerRequest server; private int replyCode; private Mahasiswa mahasiswa; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_form_mahasiswa); initView(); server = new ServerRequest(); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled( true ); mahasiswa = new Mahasiswa(); if (getIntent().hasExtra( "id" )){ String id = getIntent().getStringExtra( "id" ); String nim = getIntent().getStringExtra( "nim" ); String nama = getIntent().getStringExtra( "nama" ); String telp = getIntent().getStringExtra( "telp" ); String alamat = getIntent().getStringExtra( "alamat" ); textNim.setText(nim); textNama.setText(nama); textTelp.setText(telp); textAlamat.setText(alamat); mahasiswa.setId(Integer.valueOf(id)); } else { mahasiswa.setId( 0 ); } } private void initView(){ textNim = (EditText) findViewById(R.id.add_new_nim); textNama = (EditText) findViewById(R.id.add_new_nama); textTelp = (EditText) findViewById(R.id.add_new_telp); textAlamat = (EditText) findViewById(R.id.add_new_alamat); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.form_mahasiswa, menu); return true ; } private void goToMainActivity(){ Intent in = new Intent(getApplicationContext(), MainActivity. class ); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(in); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case android.R.id.home: goToMainActivity(); break ; case R.id.option_menu_save: if (textNim.getText().toString().trim().isEmpty() || textNama.getText().toString().trim().isEmpty()){ Toast.makeText(getApplicationContext(), "NIM dan Nama tidak boleh kosong" , Toast.LENGTH_SHORT).show(); } else { new FormMahasiswaAsync().execute(); } break ; } return super .onOptionsItemSelected(item); } private void sendRequest(){ String nim = textNim.getText().toString(); String nama = textNama.getText().toString(); String telp = textTelp.getText().toString(); String alamat = textAlamat.getText().toString(); mahasiswa.setNim(nim); mahasiswa.setNama(nama); mahasiswa.setTelp(telp); mahasiswa.setAlamat(alamat); /**Mengirimkan POST reques*/ replyCode = server.sendPostRequest(mahasiswa, ServerRequest.urlSubmit); } private class FormMahasiswaAsync extends AsyncTask @Override protected void onPreExecute() { progressDialog = new ProgressDialog(FormMahasiswa. this ); progressDialog.setMessage( "saving data..." ); progressDialog.setIndeterminate( false ); progressDialog.setCancelable( false ); progressDialog.show(); } @Override protected String doInBackground(String... params) { sendRequest(); return null ; } @Override protected void onPostExecute(String result) { progressDialog.dismiss(); if (replyCode == HttpStatus.SC_OK){ goToMainActivity(); } else { Toast.makeText(getApplicationContext(), "save data problem" , Toast.LENGTH_SHORT).show(); } } } } |
Detail Mahasiswa berfungsi untuk menampilkan data lengkap. Karena pada ListView yang ditampilkan hanya NIM dan Nama.
activity_detail_mahasiswa.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| </ p > android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" android:layout_margin = "5dp" tools:context = ".DetailMahasiswa" > < TextView android:id = "@+id/textView1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_nim" /> < EditText android:id = "@+id/add_new_nim" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_nim" android:enabled = "false" android:layout_marginBottom = "30dp" android:ems = "10" > < requestFocus /> </ EditText > < TextView android:id = "@+id/textView2" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_nama" /> < EditText android:id = "@+id/add_new_nama" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_nama" android:enabled = "false" android:layout_marginBottom = "30dp" android:ems = "10" /> < TextView android:id = "@+id/textView3" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_telp" /> < EditText android:id = "@+id/add_new_telp" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "@string/hint_telp" android:layout_marginBottom = "30dp" android:enabled = "false" android:ems = "10" /> < TextView android:id = "@+id/textView4" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/tv_alamat" /> < EditText android:id = "@+id/add_new_alamat" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:ems = "10" android:minHeight = "80dp" android:enabled = "false" android:hint = "@string/hint_alamat" android:inputType = "textPostalAddress" /> </ LinearLayout > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| package org.pizaini.mahasiswaonline; import org.pizaini.mahasiswaonline.entities.Mahasiswa; import org.pizaini.mahasiswaonline.server.ServerRequest; import android.os.AsyncTask; import android.os.Bundle; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; public class DetailMahasiswa extends Activity { private EditText textNim, textNama, textTelp, textAlamat; private Mahasiswa mahasiswa; private ServerRequest server; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_detail_mahasiswa); mahasiswa = new Mahasiswa(); server = new ServerRequest(); initView(); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled( true ); } private void initView(){ textNim = (EditText) findViewById(R.id.add_new_nim); textNama = (EditText) findViewById(R.id.add_new_nama); textTelp = (EditText) findViewById(R.id.add_new_telp); textAlamat = (EditText) findViewById(R.id.add_new_alamat); String id = getIntent().getStringExtra( "id" ); String nim = getIntent().getStringExtra( "nim" ); String nama = getIntent().getStringExtra( "nama" ); String telp = getIntent().getStringExtra( "telp" ); String alamat = getIntent().getStringExtra( "alamat" ); textNim.setText(nim); textNama.setText(nama); textTelp.setText(telp); textAlamat.setText(alamat); mahasiswa.setId(Integer.valueOf(id)); mahasiswa.setNim(nim); mahasiswa.setNama(nama); mahasiswa.setTelp(telp); mahasiswa.setAlamat(alamat); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main_action, menu); return true ; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case android.R.id.home: goToMainActivity(); break ; case R.id.action_menu_edit: Intent in = new Intent(getApplicationContext(), FormMahasiswa. class ); in.putExtra( "id" , mahasiswa.getId().toString()); in.putExtra( "nim" , mahasiswa.getNim()); in.putExtra( "nama" , mahasiswa.getNama()); in.putExtra( "telp" , mahasiswa.getTelp()); in.putExtra( "alamat" , mahasiswa.getAlamat()); startActivity(in); break ; case R.id.action_menu_delete: delete(); break ; } return super .onOptionsItemSelected(item); } private void goToMainActivity(){ Intent in = new Intent(getApplicationContext(), MainActivity. class ); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(in); } private void delete(){ AlertDialog.Builder builder = new AlertDialog.Builder( this ); builder.setMessage( "Delete " +mahasiswa.getNama()+ " ?" ); builder.setTitle( "Delete" ); builder.setPositiveButton( "Yes" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { new DetailMahasiswaAsync().execute(); Toast.makeText(getApplicationContext(), "deleted" , Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton( "No" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.setIcon(android.R.drawable.ic_menu_delete); alert.show(); } private class DetailMahasiswaAsync extends AsyncTask @Override protected String doInBackground(String... params) { server.sendGetRequest(ServerRequest.urlDelete+ "?id=" +mahasiswa.getId().toString()); return null ; } @Override protected void onPostExecute(String result) { Intent in = new Intent(getApplicationContext(), MainActivity. class ); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(in); } } } |
Tambahkan permission ada AndroidManifest.xml
1
| < uses-permission android:name = "android.permission.INTERNET" /> |
Silakan DOWNLOAD SOURCE LENGKAP (Eclipse Project dan PHP)
Silakan DOWNLOAD APK FILE nya untuk Android 3.0 (Honeycomb) atau yang terbaru.
Sekian posting hari ini, semoga dapat membahas lebih detail pada posting yang akan datang. semoga bermanfaat. Terima kasih.
sumber : cek
EmoticonEmoticon