Hai sobat, pada artikel sebelumnya yang berjudul Membuat Aplikasi Sederhana dengan Material Design, telah dijelaskan langkah-langkah membuat aplikasi sederhana dengan material design sehingga nampak bagus dan modern. Dan kali ini kita akan membuat satu aplikasi sederhana tentang portal berita dengan menggunakan json.
Pernah kan sobat mendownload aplikasi berita dari PlayStore seperti Detik.com atau Baca? Dua aplikasi tersebut termasuk aplikasi portal berita, aplikasi yang dibuat untuk menampilkan berita dari sebuah laman web. Cara ini juga bisa disebut dengan WebService, yaitu teknik mengambil informasi dari sebuah web atau menjalankan fungsi aplikasi dengan memanggil data dari web.
Dengan mengunakan webservice kita bisa mendapatkan banyak manfaat seperti kontrol jarak jauh, mempercepat pengiriman data dan ringan dalam penggunaan. Dan kali ini kita akan membuat alikasi portal berita menggunakan layanan webservice. Data untuk aplikasi portal berita ini berasal dari database mySQL yang nantinya kita panggil menggunakan JSON. JSON merupakan file javascript yang berguna untuk pertukaran data dari java ke php atau sebaliknya. Untuk membuat aplikasi android menggunakan webservice, dibutuhkan aplikasi web server untuk mengelola server web yang dibuat. Sobat bisa menggunakan aplikasi XAMPP untuk membuat database dan mengelola server.
Baik, sekarang kita buat aplikasinya, silakan sobat ikuti langkah-langkah berikut dengan cermat
Pertama, sobat buka aplikasi XAMPP sobat lalu pergi ke phpMyAdmin dan buat database baru dengan nama db_berita, jika sudah buat tabel baru dengan nama berita. Buat tabelnya seperti berikut ini
Jika sudah, sekarang sobat buat file php baru menggunakan Dreamweaver 8 atau text editor lainya. Buat kodenya seperti di bawah ini :
<?php
// definisikan koneksi ke database
$server = "localhost";
$username = "root";
$password = "";
$database = "db_berita";
// Koneksi dan memilih database di server
mysql_connect($server,$username,$password) or die("Koneksi gagal");
mysql_select_db($database) or die("Database tidak bisa dibuka");
?>
Simpan dan beri nama koneksi.php. Setelah itu sobat buat file baru dengan nama berita.php yang akan menampilkan data berita berupa list, buat kodenya seperti berikut ini
<?php
include './config/koneksi.php';
$query = mysql_query("SELECT * FROM berita ORDER BY id_berita desc");
$json = '{"berita": [';
// bikin looping dech array yang di fetch
while ($row = mysql_fetch_array ($query)) {
//tanda kutip dua (") tidak diijinkan oleh string json,
//maka akan kita replace dengan karakter `
//strip_tag berfungsi untuk menghilangkan tag-tag html pada string
$char = '"';
$json .= '{"id":"'.$row['id_berita'].'",
"judul":"'.str_replace($char,'`',strip_tags($row['judul'])).'",
"gambar":"http://192.168.77.247/portalBerita/foto_berita/'.$row['gambar'].'"},';
}
// buat menghilangkan koma diakhir array
$json = substr($json,0,strlen($json)-1);
$json .= ']}';
// print json
echo $json;
?>
Buat file baru dan beri nama detail_berita.php yang berfungsi menampilkan detail berita ketika list berita diklik, buat kodenya seperti berikut ini
<?php
$kd="";
include './config/koneksi.php';
//$kd = $_GET['idberita'];
if(isset($_GET['id_berita'])){
$kd=$_GET['id_berita'];
}
$query = mysql_query('SELECT * FROM berita where id_berita="'.$kd.'"');
$json = '{"berita": [';
while($row=mysql_fetch_array($query))
{
//tanda kutip dua (") tidak diijinkan oleh string json, maka akan kita replace dengan karakter `
//strip_tag berfungsi untuk menghilangkan tag-tag html pada string
$char = '"';
$json .='{"id":"'.$row['id_berita'].'",
"judul":"'.str_replace($char,'`',strip_tags($row["judul"])).'",
"isi":"'.str_replace($char,'`',strip_tags($row["isi_berita"])).'",
"gambar":"http://192.168.77.247/portalBerita/foto_berita/'.$row['gambar'].'"},';
}
// buat menghilangkan koma diakhir array
$json = substr($json,0,strlen($json)-1);
$json .= ']}';
// print json
echo $json;
?>
Selanjutnya sobat masukkan file tadi ke folder htdoc dan buat susunan foldernya seperti berikut ini
File-file tadi adalah file json untuk nantinya digunakan untuk memanggil data dari server. Didalam file php di atas terdapat url server untuk mengakses file tersebut, silahkan disesuaikan menurut struktur dan url/nomor IP milik sobat.
Selanjutnya kita akan membuat aplikasinya di Android Studio, seperti biasa pertama sobat buat project baru dengan nama Portal Berita dan untuk packagenya dengan nama blogsetyaaji.com
Saat mengatur activity, ubahlah nama MainActivity menjadi BeritaUtama, sedangkan activity_main.xml ubahlah menjadi berita_utama.xml
Selanjutnya sobat instal dulu dependencies yang dibutuhkan di buld:grandle(Module app) dengan cara menyesuaikan kodenya seperti di bawah ini
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.blogsetyaaji.portalberita2"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
useLibrary 'org.apache.http.legacy'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.1.1'
compile 'com.android.support:cardview-v7:24.1.1'
compile 'de.hdodenhof:circleimageview:2.0.0'
compile 'com.squareup.picasso:picasso:2.5.2'
}
Akan muncul pemberitahuan di atas kode editor pilih sync now
Pindah ke pengaturan layout, sobat buka Berita_Utam.xml dan buat kodenya seperti berikut ini
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#070707"
android:textSize="10sp" />
<View
android:layout_height="1dp"
android:layout_width="fill_parent"
android:background="#f5f2f2" />
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#f5f2f2"
android:dividerHeight="1dp" />
</LinearLayout>
Selanjutnya buat layout baru lagi dengan nama list_row.xml dan buat kodenya seperti berikut ini
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp"
android:orientation="horizontal">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/gambar"/>
<TextView
android:id="@+id/kode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kode"
android:visibility="gone" />
<TextView
android:id="@+id/judul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Judul"
android:layout_marginTop="5dp"
android:layout_marginLeft="16dp"/>
</LinearLayout>
Buat file layout lagi dengan nama single_list_item.xml dan buat kodenya seperti berikut ini
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:background="#fffefe"
android:padding="10dp"
android:layout_height="wrap_content">
<TextView android:id="@+id/judul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dip"
android:textStyle="bold"
android:paddingTop="10dip"
android:paddingBottom="5dip"
android:textColor="#333333"/>
<TextView android:id="@+id/detail"
android:layout_width="wrap_content"
android:textStyle="bold"
android:textSize="12dip"
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:layout_height="wrap_content"
android:textColor="#999999"/>
<ImageView
android:id="@+id/imageView1"
android:layout_width="250dip"
android:layout_gravity="center"
android:layout_height="150dip"
android:src="@drawable/no_image"/>
<TextView android:id="@+id/content"
android:layout_width="wrap_content"
android:textSize="14dip"
android:layout_height="wrap_content"
android:textColor="#333333"/>
</LinearLayout>
</ScrollView>
Setelah membuat file layout, sekarang kita membuat file java. Di sini kita membutuhkan beberapa file java dan library yang digunakan untuk memanggil dan menampilkan data json yang telah diparsing berupa file gambar.
Dan untuk pertama kali, silahkan sobat buka file BeritaUtama.java dan buat kodenya seperti berikut ini
package com.blogsetyaaji.portalberita2;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
public class BeritaUtama extends Activity {
private ProgressDialog pDialog;
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> DaftarBerita = new
ArrayList<HashMap<String, String>>();
private static String url_berita = "http://192.168.77.247/portalBerita/berita.php";
public static final String TAG_ID = "id";
public static final String TAG_JUDUL = "judul";
public static final String TAG_GAMBAR = "gambar";
JSONArray string_json = null;
ListView list;
LazyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.berita_utama);
DaftarBerita = new ArrayList<HashMap<String, String>>();
new AmbilData().execute();
list = (ListView) findViewById(R.id.list);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
HashMap<String, String> map = DaftarBerita.get(position);
// Starting new intent
Intent in = new Intent(getApplicationContext(), DetailBerita.class);
in.putExtra(TAG_ID, map.get(TAG_ID));
in.putExtra(TAG_GAMBAR, map.get(TAG_GAMBAR));
startActivity(in);
}
});
}
public void SetListViewAdapter(ArrayList<HashMap<String,
String>> berita) {
adapter = new LazyAdapter(this, berita);
list.setAdapter(adapter);
}
class AmbilData extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(BeritaUtama.this);
pDialog.setMessage("Mohon tunggu...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(String... args) {
List<NameValuePair> params = new
ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url_berita,
"GET", params);
Log.i("Ini nilai json ", ">" + json);
try {
string_json = json.getJSONArray("berita");
for (int i = 0; i < string_json.length(); i++) {
JSONObject c = string_json.getJSONObject(i);
String id_berita = c.getString(TAG_ID);
String judul = c.getString(TAG_JUDUL);
String link_image = c.getString(TAG_GAMBAR);
HashMap<String, String> map = new HashMap<String,
String>();
map.put(TAG_ID, id_berita);
map.put(TAG_JUDUL, judul);
map.put(TAG_GAMBAR, link_image);
DaftarBerita.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();
runOnUiThread(new Runnable() {
public void run() {
SetListViewAdapter(DaftarBerita);
}
});
}
}
}
Selanjutnya, sobat buat file java lagi dengan nama JSONParser.java dan buat kodenya seperti berikut ini
package com.blogsetyaaji.portalberita2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
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.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
public JSONParser() {
}
// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// Making HTTP request
try {
// check for request method
if (method == "POST") {
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} else if (method == "GET") {
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new
InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " +
e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
Buat file java baru dengan nama FileCache.java, buat kodenya seperti berikut
package com.blogsetyaaji.portalberita2;
import java.io.File;
import android.content.Context;
public class FileCache {
private File cacheDir;
public FileCache(Context context) {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(android.os.Environment
.getExternalStorageDirectory(), "LazyList");
else
cacheDir = context.getCacheDir();
if (!cacheDir.exists())
cacheDir.mkdirs();
}
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
File f = new File(cacheDir, filename);
return f;
}
public void clear() {
File[] files = cacheDir.listFiles();
if (files == null)
return;
for (File f : files)
f.delete();
}
}
ImageLoader.java
package com.blogsetyaaji.portalberita2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
}
final int stub_id = R.drawable.no_image;
public void DisplayImage(String url, ImageView imageView) {
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null)
imageView.setImageBitmap(bitmap);
else {
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null)
return b;
try {
Bitmap bitmap = null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
private Bitmap decodeFile(File f) {
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null,
o2);
} catch (FileNotFoundException e) {
}
return null;
}
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
@Override
public void run() {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
Activity a = (Activity) photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
LazyAdapter.java
package com.blogsetyaaji.portalberita2;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater = null;
// public ImageLoader imageLoader;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d)
{
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// imageLoader = new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup
parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.list_row, null);
TextView id_berita = (TextView) vi.findViewById(R.id.kode);
TextView judul = (TextView) vi.findViewById(R.id.judul);
ImageView thumb_image = (ImageView) vi.findViewById(R.id.gambar);
HashMap<String, String> daftar_berita = new HashMap<String, String>();
daftar_berita = data.get(position);
id_berita.setText(daftar_berita.get(BeritaUtama.TAG_ID));
judul.setText(daftar_berita.get(BeritaUtama.TAG_JUDUL));
// imageLoader.DisplayImage(daftar_berita.get(BeritaUtama.TAG_GAMBAR),thumb_image);
Picasso.with(activity.getApplicationContext())
.load(daftar_berita.get(BeritaUtama.TAG_GAMBAR))
.error(R.drawable.no_image)
.into(thumb_image);
return vi;
}
}
MemoryCache.java
package com.blogsetyaaji.portalberita2;
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.graphics.Bitmap;
public class MemoryCache {
private Map<String, SoftReference<Bitmap>> cache = Collections
.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());
public Bitmap get(String id) {
if (!cache.containsKey(id))
return null;
SoftReference<Bitmap> ref = cache.get(id);
return ref.get();
}
public void put(String id, Bitmap bitmap) {
cache.put(id, new SoftReference<Bitmap>(bitmap));
}
public void clear() {
cache.clear();
}
}
Utils.java
package com.blogsetyaaji.portalberita2;
import java.io.InputStream;
import java.io.OutputStream;
public class Utils {
public static void CopyStream(InputStream is, OutputStream os) {
final int buffer_size = 1024;
try {
byte[] bytes = new byte[buffer_size];
for (;;) {
int count = is.read(bytes, 0, buffer_size);
if (count == -1)
break;
os.write(bytes, 0, count);
}
} catch (Exception ex) {
}
}
}
DetailBerita.java
package com.blogsetyaaji.portalberita2;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class DetailBerita extends Activity {
public ImageLoader imageLoader;
{
imageLoader = new ImageLoader(null);
}
JSONArray string_json = null;
String idberita;
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
public static final String TAG_ID = "id";
public static final String TAG_JUDUL = "judul";
public static final String TAG_ISI = "isi";
public static final String TAG_GAMBAR = "gambar";
private static final String url_detail_berita =
"http://192.168.77.247/portalBerita/detailberita.php";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_list_item);
Intent i = getIntent();
idberita = i.getStringExtra(TAG_ID);
Toast.makeText(getApplicationContext(),
"id berita = " + idberita,
Toast.LENGTH_SHORT).show();
new AmbilDetailBerita().execute();
}
class AmbilDetailBerita extends AsyncTask<String, String,
String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(DetailBerita.this);
pDialog.setMessage("Mohon Tunggu ... !");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
protected String doInBackground(String... params) {
try {
List<NameValuePair> params1 = new
ArrayList<NameValuePair>();
params1.add(new
BasicNameValuePair("id_berita",idberita));
JSONObject json = jsonParser.makeHttpRequest(
url_detail_berita, "GET", params1);
string_json = json.getJSONArray("berita");
runOnUiThread(new Runnable() {
public void run() {
ImageView thumb_image = (ImageView)
findViewById(R.id.imageView1);
TextView judul = (TextView)
findViewById(R.id.judul);
//TextView detail = (TextView)
findViewById(R.id.detail);
TextView isi = (TextView)
findViewById(R.id.content);
try {
// ambil objek member pertama dari JSON Array
JSONObject ar =
string_json.getJSONObject(0);
String judul_d = ar.getString(TAG_JUDUL);
String isi_d = ar.getString(TAG_ISI);
String url_detail_image = ar.getString(TAG_GAMBAR);
judul.setText(judul_d);
isi.setText(isi_d);
// imageLoader.DisplayImage(ar.getString(TAG_GAMBAR),thumb_image);
Picasso.with(getApplicationContext())
.load(url_detail_image)
.error(R.drawable.no_image)
.into(thumb_image);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();
}
}
}
Tahap pembuatan file java dan library selesai, sekarang sobat buka directory Manifest dan buka AndroidManifest.xml dan tambahkan user permission seperti di bawah ini
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Jika sudah semuanya, silahkan sobat jalankan aplikasinya, maka tampilan dari aplikasi portal beritanya akan seperti berikut ini
Dan ini video tampilan aplikasi portal berita dari tutorial di atas
Silahkan jika sobat ingin melihat dan mendownload contoh project dari tutorial ini, jangan lupa follow dan bintangnya.. 😂
Dan itulah cara membuat aplikasi portal berita android dengan database mySQL dan JSON
Sekian artikel tentang Membuat Aplikasi Portal Berita Android dengan JSON semoga bermanfaat, tetap ikuti Blog Setya Aji untuk tutorial menarik lainya.
106 komentar
Click here for komentarhi mas aji,sy coba bbrp tutorialnya oke banget,tapi banyak erornya contoh untuk membuat aplikasi portal berita json itu di lazyadapter ada find id R.id.kode itu kode itu kode ambil dari mana ya?
Replyterimaksih telah berkunjung dan untuk komentarnya mas, id.kode yang ada pada LazyAdapter itu sebenarnya diambil dari layout list_row yang berfungsi untuk menampilkan masing-masing data pada wdget ListView, begitu juga dengan id.judul dan id.gamgar diambil dari layout list_row. Tetapi dalam tutorial di atas ada sedikit kesalahan, bisa mas lihat pada kode list_row.xml dan berita_utama.xml kodenya sama, untuk itu akan saya perbaiki secepatnya kode pada list_row
ReplyHallo mas Aji, untuk halaman input buat adminnya harus lewat web juga ya?
Replyiya mas, jadi datanya diambil dari database yang dibuat, dan untuk memasukkan data bisa langsung dari database atau buat halaman adminnya di web.. =D
Replypermisi mas mau nanya
Replyyang di single list arrow kan ada @drawable/no_image
itu maksudnya apa y
iya mas, maksudnya kode src=@drawable/no_image yang ada di single_list_item.xml ? itu adalah jika gambarnya belum muncul, maka akan menampilkan gambar dengan nama no_image, gambar tersebut harus disiapkan atau dimasukkan ke dalam folder drawable terlebih dahulu mas :D
Replyterima kasih tutorialnya, tapi saya masih bingung tentang transfer datanya gmna ya mas? jadi admin input data berita sendiri, begitu ta? yang alamat ip.. http:192.168.77.... bla bla itu ip nya komputernya kita sendiri bukan?
Replysama-sama mba.. iya admin input data sendiri dimasukkin ke dalam databse dimysql, jadi untuk aplikasi ini membutuhkan web aplikasi atau server untuk menambahkan data ke database mysql..
Replyiya mba, itu ip atau url domain kita mba.. engga bisa pakai localhost.. =D
Kakak maaf, saya coba tpi pas d running has stopped terus, knp ya kak?
ReplyIya saya juga sama kak
Replyada merah erornya ga? jika ga ada mungkin nanti saya revisi lagi kodenya
Replymas... sediain layanan download project nya.... via google drive,/ uptobox..
Replyoke mas, mungkin anti ya mas, project disaya dah kehapus hehe =D
ReplyIni bisa dikoneksikan dengan blog? Misalkan saya posting artikel diblog trus datanya langsung masuk diportalnya gitu!!. Terimakasih sebelumnya
Replyterimakasih juga.. kalau pada tutorial ini tidak bisa, datanya dari website biayan sendiri atau database buatan sendiri..
Replymaaf sebelumnya itu yang kode app(dibuld:grandle) itu buatnya dimana dan bagaimana yaa baru tahap belajar
Replymakasih dah berkunjung om, untuk kodenya disesuaikan ke dalam file yang namanya build:grandle, letaknya di dalam folder grandle, di sisi kiri android studio..
Replymantap gan, sangat membantu (y)
Replymalem agan aji setya.. ane mau tanya gan,itu untuk db nya.. id_cat untuk apa ya gan? maaf ane newbie.. mohon pencerahannya ya gan...thanks banget..
Replymau tanya gan, kan saya upload gambar di mysql ko di android nggak kebaca ya, kira kira itu apanya ya gan?
Replyupload gambar gimana gan? di database tinggal masukin aja nama gambarnya, nanti gambarnya ditampilin sesuai url server gambar gan
Replyiya sama-sama gan, terimakasih udah berkunjung
Replyoo... itu field untuk kategori berita gan hehe
Replyini bisa menggunakan eclipse gak?
Replykalo bisa untuk menambahkan dependencies nya di eclipse gimana ya?
engga tau mas, saya saranin sekarang pakai android studio karena eclipse sudah tidak dikembangkan lagi. Dan untuk menginstal librari atau dependencies lebih mudah pakai android studio :-d
Replykok import nya error ya mas..
Replyimport org.apache.http.NameValuePair;
padahal di build:gradle app sudah ditambahkan useLibrary 'org.apache.http.legacy' nya
klo untuk web server dengan menggunakan hosting gimana mas? spertinya hosting saya hanya bisa membaca format mysqli untuk query php nya...
Replymas bikin link download project nya donk.. hehe..
hehe untuk server yang sudah dihosting tinggal diganti aja url nya di bagian java dengan url file yang sudah dihosting. untuk kode php dgn mysqli cuma merubah di file phpnya aja mas, kodenya kurang lebih sama..
Replyhehe nanti saya buat lagi deh, itu file projectya dah ga ada hehe
siang mas aji, maaf mau nanya mas.. itu saya udah berhasil run, tp pas dipilih salah satu untuk menampilkan detail, koq malah unfortunately ....... has stopped ya mas?? mohon bantuannya ya mas.. thanks
Replysiang mas aji, maaf mau nanya mas.. itu saya udah berhasil run, tp pas dipilih salah satu untuk menampilkan detail, koq malah unfortunately ....... has stopped ya mas?? mohon bantuannya ya mas.. thanks
Replyterimakasih sudah berkunjung mas. Setelah mencoba tutorial di atas datanya muncul, tapi ketika di klik force close ya.. coba di bagian bawah ada tab android monitor mas buka, kemudian periksa error yang muncul ketika mas meng klik data.. atau mas bisa copy errornya di sini agar saya bisa lebih paham permasalahanya mas hehe =D
Replyerrornya
ReplyAndroid Studio: InvalidVirtualFileAccessException trying to render an XML layout
apa mungkin perlu layout baru untuk menampilkan detailnya ya mas aji?
di dalam class detail berita, di sana ada kode setContentView(R.layout.single_list_item); berarti untuk menampilkan detail berita aplikasi menggunakan layout single_list_item, coba mas periksa apakah file layout itu ada di projectnya mas..
Replyudah mas, dan sudah mau.. masalahnya di manifest.xml nya.. karna dia class yg terpisah sama layout jd harus di deklarasikan manual..
Replycm skarang masalahnya, pas masuk ke layout detailnya, malah isinya cm gambar yg no_image itu mas.. gak mau nampilin isi deskripsi dan gambar yg sesuai.. itu gamna ya mas aji.. mohon bantuannya...
gambarnya ga nampil ya, coba cari kode ini di class detail
ReplyPicasso.with(getApplicationContext())
.load(url_detail_image)
.error(R.drawable.no_image)
.into(thumb_image);
kalo ketemu coba kode .load(url_detail_image) diubah menjadi .load("url serfer foto" + url_detail_image)
udah saya buat gini mas
Replypicasso.with(getApplicationContext())
.load("http://ip_saya/PortalBerita/image/"+url_detail_image)
.error(R.drawable.no_image)
.into(thumb_image);
tp tetep aja keluar no_image dengan tampil info id yg dipilih aja..
apa ada yg salah sama php nya ya mas aji? mohon bantuannya.. thanks
untuk judul sama isi beritanya muncul ga mas ? =D
Replygak muncul semua... yg muncul cm no_image yg digunakan untuk pesan error itu aja mas...
Replymm.. banyak kemungkinanya si mas, error yang tampil di android monitor cuma itu tadi saja mas?
Replyiya cm itu aja errornya mas.. gak mau tampil judul desk n gambarnya...
Replysusah juga kalau ga langsung liat haha :D
Replymas bisa bikin link aplikasi nya dong mas..
Replysudah saya tambahkan mas, silahkan di sedot :-bd
Replysilahkan dicek om, sudah saya tambahkan di artikel :-bd
Replysalam kenal mas Aji, saya jalankan skrip berita.php diatas kok muncul error seperti ini, kira2 error dimana ya mas ? saya menggunakan XAMPP
Reply1.7.7
[PHP: 5.3.8]
Notice: Use of undefined constant id_berita - assumed 'id_berita' in C:\xampp\htdocs\xampp\lokoandro\berita.php on line 15
salam kenal juga mas dwi, mungkin ada simbol yang salah mas
ReplyMas untuk menampilkan action bar yang diatas pada berita_utama.xml pada saat dijalankan gimana ya?
ReplyTerus untuk memperbesar font pada listview nya gimana ya?
mas, kalo beritanya kan saya menggunakan tinymce utk inputan editor...jadi bisa ada style nya gtu, tp pas di android ga mnncul, yg muncul malah tag html nya bukan style nya...itu gmana ya mas ?
Replyhpyerlink juga ga bisa, trus klo ada inputan enter malah muncul di androidnya (json nya)
untuk kode html bisa menampilkanya di dalam komponen WebView, mas bisa buka di artikel saya yang terbaru
Replyhttp://blogsetyaaji.blogspot.co.id/2017/04/menampilkan-kode-html-pada-webview.html
mas. saat listview di klik aplikasi langsung keluar,, yang salah dimana ya mas
Replycoba buka menu android monitor mas, terus dicari error yang ada..
Replykaga ada mas? Sdk pengaruh gak mas
Replysdk ga ngaruh mas, tapi lebih baik kalau diliat dulu keterangan pada log android monitor agar tau kesalahanya dimana..
Replymuncul kaya gini mas ?
ReplyUnable to obtain result of 'adb version'
mas itu untuk web nya udah CRUD belum?
Replymaaf mas terus bagaimana mengelola data ke databsenya?
Replyfile php nya itu, sebagai json untuk memparsing data dari server ke activity androidnya.. trus untuk update datanya bisa dibuatkan web admin sendiri atau langsung ke php myadmin untuk ngelola datanya... semoga membantu..
Replyterimakasih sudah membagi ilmu ini, saya merasa terbantu sekali.. saya doakan mas aji sukses selalu. amin
Replyamin.. terimakasih dukunganya mas..
Replymas detail berita udah bisa di buka setelah dependencies saya ubah, tp gambar tidak muncul baik di listview maupun detail berita? solusinya mas...
Replycoba dicocokin url gambarnya om.. alamat url nya kalau diakses di web muncul ga.. semoga membantu om hehe
Replykalo akses di web muncul mas
Replybang boleh minta source code project nya ga buat latihan nih, banyak error ngikutin tutor diatas :(
Replymas kasus saya sama dengan mas ilham sudah saya ganti juga .Load nya tapi gambar, judul dan isi masih kosong dan di logcatnya ada pesan error seperti ini:
ReplyE/JSON Parser: Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONObject
E/EGL_emulation: tid 19945: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
E/EGL_emulation: tid 19945: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
gan, untuk urlnya yg nnti akan diparsing bisa menggunakan url website punya org tidak ?misalkan aja nih mau memparsing data dari (www.tribunnews.com)
Replyterima kasih mas atas tutorial nya.
Replybisa kirimkan source code nya mas, mau latihan!
benni.pards@gmail.com
Mas, kalo menggunakan recyclerview dan library volley dan glide hasil tutorial yang kemaren, yang ini blogsetyaaji.blogspot.co.id/2017/02/menampilkan-data-mysql-ke-aplikasi.html apa bisa dilanjutkan seperti ini?
Replyuntuk source codenya bisa mas download di github saya mas, link nya ada di tombol start dalam artikel itu..
Replybisa mas.. silahkan dikembangkan sesuai imajinasi mas hehe
Replysore mas aji....mas kalau scripnya pakai MySQLi gimana ya mas ...bissa kasih contoj
Replysore juga.. untuk MYSQLI hanya diubah sedikit kodenya pada file php seperti koneksi database dan menampilkan data menggunakan query MSQLI, kodenya bisa dibuka di w3school.com
Replymas boleh minta projectnya ?
Replykirim lewat email ya mas, ini email saya mochamadadi24@gmail.com
C:\Users\ADIMAS\Documents\Project Android Studio\berita\app\src\main\java\com\example\adimas\berita\BeritaUtama.java
ReplyError:(14, 27) error: package org.apache.http does not exist
Error:(72, 18) error: cannot find symbol class NameValuePair
Error:(73, 31) error: cannot find symbol class NameValuePair
C:\Users\ADIMAS\Documents\Project Android Studio\berita\app\src\main\java\com\example\adimas\berita\JSONParser.java
Error:(9, 23) error: package org.apache.http does not exist
Error:(10, 23) error: package org.apache.http does not exist
Error:(11, 23) error: package org.apache.http does not exist
Error:(12, 30) error: package org.apache.http.client does not exist
Error:(13, 37) error: package org.apache.http.client.entity does not exist
Error:(14, 38) error: package org.apache.http.client.methods does not exist
Error:(15, 38) error: package org.apache.http.client.methods does not exist
Error:(16, 36) error: package org.apache.http.client.utils does not exist
Error:(29, 71) error: cannot find symbol class NameValuePair
Error:(36, 17) error: cannot find symbol class DefaultHttpClient
Error:(36, 52) error: cannot find symbol class DefaultHttpClient
Error:(37, 17) error: cannot find symbol class HttpPost
Error:(37, 41) error: cannot find symbol class HttpPost
Error:(38, 40) error: cannot find symbol class UrlEncodedFormEntity
Error:(39, 17) error: cannot find symbol class HttpResponse
Error:(40, 17) error: cannot find symbol class HttpEntity
Error:(44, 17) error: cannot find symbol class DefaultHttpClient
Error:(44, 52) error: cannot find symbol class DefaultHttpClient
Error:(45, 38) error: cannot find symbol variable URLEncodedUtils
Error:(47, 17) error: cannot find symbol class HttpGet
Error:(47, 39) error: cannot find symbol class HttpGet
Error:(48, 17) error: cannot find symbol class HttpResponse
Error:(49, 17) error: cannot find symbol class HttpEntity
Error:(54, 18) error: cannot find symbol class ClientProtocolException
C:\Users\ADIMAS\Documents\Project Android Studio\berita\app\src\main\java\com\example\adimas\berita\DetailBerita.java
Error:(20, 23) error: package org.apache.http does not exist
Error:(21, 31) error: package org.apache.http.message does not exist
Error:(69, 22) error: cannot find symbol class NameValuePair
Error:(70, 35) error: cannot find symbol class NameValuePair
Error:(72, 25) error: cannot find symbol class BasicNameValuePair
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
kok banyak yang error ya mas
List params = new
ArrayList();
halo agan setyaaji, aku masih bingung tentang kirim2 datanya dari database mysql ke android studio? alamat ip di jason itu alamat IP dimana mas? dan apakah hanya dengan menulis IP sperti itu bisa langsung dideteksi di android studio, thx
Replymaaf sebelumya gan, untuk file project silahkan agan download dari github saya pada tombol2 di artikel saya ini..
Replyiya gan, semoga artikel dan penjelasan saya ini bisa membantu agan..
Replyalamat ip itu diambil dari alamat server agan, jika server atau file php agan masih di dlm localhost, maka ambil ip v4 jaringan agan yg bisa diambil dr perintah ipconfig pada command prompt
jika server atau file php agan sudah dihosting ke internet, maka gunakan url server pada hostingan agan..
kedua alamat ip/url tadi akan dipanggil secera ptomatis oleh android studio atau aplikasi ketika perintah pemanggilan data dirksekusi..
bang bagi projact ny dong gak nemu ni
Replytmbahin useLibrary 'org.apache.http.legacy' di bagian build.gradle (module app) nya gan
Replyprojectnya bisa di download di tombol 3 itu, tinggal dipilih hehe
Replykk, ini satu tabel satu berita atau satu tabel banyak berita?
Replykk, picasso itu apa ya, soalnya code error nya hanya disitu?
Terimakasih
ini satu table banyak berita..
Replypicasso itu adalah sejenis librari yang digunakan untuk menampilkan gambar, untuk info lebih lanjut km bisa lihat di http://square.github.io/picasso/
semoga membantu.. 😊
kalau yang pake wordpress gimana
ReplyKok saya ga bisa pake tipe data text ya buat field isi? Pas diganti varchar baru bisa, padahal kan field isi butuh storage yg besar
ReplyTerimakasih
Replygan misalnya ane Json-nya pake web ini https://api.kawaiibeautyjapan.com/v1/article
Replycara biar masing2 object array kebuka di Detail.java-nya gimana ya?
bisa mas, tinggal dipanggil di activity berita, terus pas buka detail dilempar sama intent.putExtra,
Replyatau mas bisa lihat tutorial saya tentang mengirim json ke activity lain
maksud ane manggil masing2 Object "id" yang ada di situs https://api.kawaiibeautyjapan.com/v1/article buat dipanggil di masing2 detail.java-nya
Replymungkin agak susah tanpa gambar. tapi tiap ane coba debug detail.java-nya selalu manggil object "id" yang paling pertama alias yang ini pada tiap listview item-nya
"id": 3255,
"permalink": "http://kawaiibeautyjapan.com/article/3255/5-tips-diet-mudah-yang-bisa-kamu-lakukan-bersama-pasanganmu",
"slug": "5-tips-diet-mudah-yang-bisa-kamu-lakukan-bersama-pasanganmu",
"title": "5 Tips Diet Mudah yang Bisa Kamu Lakukan Bersama Pasanganmu",
yang keambil data yang pertama ya, coba mas, atur di detailnya sesuai posisinya (position) kaya gini
ReplyIntent in = new Intent(getApplicationContext(), DetailBerita.class);
in.putExtra(TAG_ID, map.get(position).get(TAG_ID));
startActivity(in);
itu .get() nya gak bisa dua gan
Replyternyata object "id" ane itu Integer
Replymalah lebih repot lagi ini
kalau gitu langsung aja ke get(data)
Replykalau integer berati tinggal parse aja ke integer mas pake Integer.parse
Replyudah bisa gan
Replyternyata getJSONArray ane diganti ke getJSONObject
mas mau tanya,sya sudah ikutin step by step seperti yg diatas IP sudah dicocokin sama IP Laptop dan gk ada error, pas di run di Hp Android cuma load mohon tunggu sampai portal berita terhenti. itu bgaimana yamas? mohon bantuannya.
Replysip dah.. silahkan dikembangkan mas
Replypas dijalankan coba dicek di Android Monitor mas utk tahu kesalahanya dimana
Replygan, agan bisa nggak nge-debug app ini di android Lollipop kebawah?
ReplyPermisi mas, sebelumnya terima kasih buat tutorialnya mas, saya mau tanya, kebetulan saya baru belajar Android. Waktu saya coba tutorial di atas, dan saya Run, di Logcat Android Monitornya muncul teks merah ini mas. Bingung saya banyak banget :D Appsnya waktu saya buka langsung force close mas,
ReplyTeks merahnya gini:
E/WindowManager: android.view.WindowLeaked: Activity com.hatespeech.yogi.hsapp2.BeritaUtama has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41f335d8 V.E..... R......D 0,0-684,192} that was originally added here
at android.view.ViewRootImpl.(ViewRootImpl.java:455)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:250)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.Dialog.show(Dialog.java:297)
at com.hatespeech.yogi.hsapp2.BeritaUtama$AmbilData.onPreExecute(BeritaUtama.java:73)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
at android.os.AsyncTask.execute(AsyncTask.java:535)
at com.hatespeech.yogi.hsapp2.BeritaUtama.onCreate(BeritaUtama.java:46)
at android.app.Activity.performCreate(Activity.java:5399)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2498)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595)
at android.app.ActivityThread.access$800(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1513)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5529)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:657)
at dalvik.system.NativeStart.main(Native Method)
wah banyak banget mas, itu di kodenya ga ada yang merah mas?
Replygak ada yang merah mas, bisa di build kok. Saya nge-run-nya pakai hape, pas aplikasinya dibuka langsung force close gitu dan muncul teks merah yang banyak itu di logcat-nya :(
Replytolong banget bantuannya mas, untuk skripsi soalnya :(
mm.. coba upload projectnya ke google drive terus linknya kirim ke saya mas hehe
ReplyYa ampun mas, makasih banget :) siap mas!
ReplyLink: https://drive.google.com/file/d/0B-ztZ2lzuAC2U3Z6U1BRX0thYWM/view
gan, itu app agan ada sistem pagination-nya nggak?
Replyuntuk artikel ini hanya menampilkan berita dalam listview aja gan.. belum pake pagination..
Replygan kalau menampilkan jarak latitude dan longitude pada listview gmn ya caranya
Replygan ane kok pas masuk detail error mulu ya gan,,ni logchat ane,,
Reply08-18 19:54:43.222 16170-17587/baru.azoel.ayomuncak E/JSON Parser: Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
08-18 19:54:43.235 16170-16170/baru.azoel.ayomuncak W/System.err: org.json.JSONException: No value for isi
itu kenapa gan?pas dicoba di php nya keluar array nya...tapi kenapa pas di JSONObject nya gagal ya om?
Terimakasih atas kunjunganya.
Jika ada pertanyaan, komentar, atau saran, silakan tulis pada kolom di bawah ini.
ConversionConversion EmoticonEmoticon