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)
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
<
html
>
<
head
>
<
title
>Index Android</
title
>
</
head
>
<
body
>
<
h3
>Index Android</
h3
>
</
body
>
</
html
>
connection.php
<?php
/*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());
?>
<?php
/*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
);
?>
submit_mahasiswa.php
<?php
/**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());
?>
<?php
/**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 adalah konsep Object Relational Mapping (ORM) yang
menggunakan object yang sama untuk memetakan table pada database.
Mahasiswa.java
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
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<NameValuePair> value =
new
ArrayList<NameValuePair>();
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
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.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
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
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<Mahasiswa> list, filterd;
public
ListAdapterMahasiswa(Context context, List<Mahasiswa> 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<Mahasiswa> filteredData =
new
ArrayList<Mahasiswa>();
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<Mahasiswa>) results.values;
notifyDataSetChanged();
}
}
}
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.
private List<Mahasiswa> processResponse(String response){ List<Mahasiswa> list = new ArrayList<Mahasiswa>(); 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; } |
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.
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<Mahasiswa> 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<Mahasiswa>();
/** 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<Mahasiswa> processResponse(String response){
List<Mahasiswa> list =
new
ArrayList<Mahasiswa>();
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<String, Void, String>{
@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 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.
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<String, String, String>{ @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
</
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
>
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<String, String, String>{ @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.
GitHub project: BelajarAndroid.
Sekian posting hari ini, semoga dapat membahas lebih detail pada posting yang akan datang. semoga bermanfaat. Terima kasih.