Membuat Aplikasi Portal Berita Android dengan JSON

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.

Membuat Aplikasi Portal Berita Android dengan 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

Membuat Aplikasi Portal Berita Android dengan JSON

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

Membuat Aplikasi Portal Berita Android dengan JSON

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

Membuat Aplikasi Portal Berita Android dengan JSON

Membuat Aplikasi Portal Berita Android dengan JSON

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.. 😂

Follow @AjiSetya Watch Star


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.


Previous
Next Post »

106 komentar

Click here for komentar
pandawa
admin
12 October 2016 at 14:27 ×

hi 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?

Reply
avatar
Aji Setya
admin
16 October 2016 at 07:07 ×

terimaksih 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

Reply
avatar
Road Warrior
admin
3 November 2016 at 16:01 ×

Hallo mas Aji, untuk halaman input buat adminnya harus lewat web juga ya?

Reply
avatar
Aji Setya
admin
7 November 2016 at 11:41 ×

iya mas, jadi datanya diambil dari database yang dibuat, dan untuk memasukkan data bisa langsung dari database atau buat halaman adminnya di web.. =D

Reply
avatar
the criz
admin
28 November 2016 at 21:37 ×

permisi mas mau nanya
yang di single list arrow kan ada @drawable/no_image
itu maksudnya apa y

Reply
avatar
Aji Setya
admin
29 November 2016 at 22:52 ×

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

Reply
avatar
13 December 2016 at 00:52 ×

terima 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?

Reply
avatar
Aji Setya
admin
13 December 2016 at 10:45 ×

sama-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..

iya mba, itu ip atau url domain kita mba.. engga bisa pakai localhost.. =D

Reply
avatar
21 December 2016 at 19:25 ×

Kakak maaf, saya coba tpi pas d running has stopped terus, knp ya kak?

Reply
avatar
Anonymous
admin
22 December 2016 at 23:58 ×

Iya saya juga sama kak

Reply
avatar
Aji Setya
admin
24 December 2016 at 20:25 ×

ada merah erornya ga? jika ga ada mungkin nanti saya revisi lagi kodenya

Reply
avatar
Rizqi Fatur
admin
17 January 2017 at 11:24 ×

mas... sediain layanan download project nya.... via google drive,/ uptobox..

Reply
avatar
Aji Setya
admin
17 January 2017 at 20:59 ×

oke mas, mungkin anti ya mas, project disaya dah kehapus hehe =D

Reply
avatar
19 January 2017 at 12:47 ×

Ini bisa dikoneksikan dengan blog? Misalkan saya posting artikel diblog trus datanya langsung masuk diportalnya gitu!!. Terimakasih sebelumnya

Reply
avatar
Aji Setya
admin
19 January 2017 at 22:40 ×

terimakasih juga.. kalau pada tutorial ini tidak bisa, datanya dari website biayan sendiri atau database buatan sendiri..

Reply
avatar
22 January 2017 at 14:02 ×

maaf sebelumnya itu yang kode app(dibuld:grandle) itu buatnya dimana dan bagaimana yaa baru tahap belajar

Reply
avatar
Aji Setya
admin
24 January 2017 at 15:38 ×

makasih dah berkunjung om, untuk kodenya disesuaikan ke dalam file yang namanya build:grandle, letaknya di dalam folder grandle, di sisi kiri android studio..

Reply
avatar
Himawan riza
admin
30 January 2017 at 12:39 ×

mantap gan, sangat membantu (y)

Reply
avatar
2 February 2017 at 19:19 ×

malem 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..

Reply
avatar
imam af
admin
23 February 2017 at 13:48 ×

mau tanya gan, kan saya upload gambar di mysql ko di android nggak kebaca ya, kira kira itu apanya ya gan?

Reply
avatar
Aji Setya
admin
24 February 2017 at 17:28 ×

upload gambar gimana gan? di database tinggal masukin aja nama gambarnya, nanti gambarnya ditampilin sesuai url server gambar gan

Reply
avatar
Aji Setya
admin
24 February 2017 at 17:29 ×

iya sama-sama gan, terimakasih udah berkunjung

Reply
avatar
Aji Setya
admin
24 February 2017 at 17:32 ×

oo... itu field untuk kategori berita gan hehe

Reply
avatar
ahmad fachri
admin
9 March 2017 at 12:02 ×

ini bisa menggunakan eclipse gak?
kalo bisa untuk menambahkan dependencies nya di eclipse gimana ya?

Reply
avatar
Aji Setya
admin
10 March 2017 at 21:20 ×

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

Reply
avatar
ahmad fachri
admin
12 March 2017 at 09:06 ×

kok import nya error ya mas..

import org.apache.http.NameValuePair;

padahal di build:gradle app sudah ditambahkan useLibrary 'org.apache.http.legacy' nya

Reply
avatar
Unknown
admin
20 March 2017 at 13:47 ×

klo untuk web server dengan menggunakan hosting gimana mas? spertinya hosting saya hanya bisa membaca format mysqli untuk query php nya...

mas bikin link download project nya donk.. hehe..

Reply
avatar
Aji Setya
admin
20 March 2017 at 14:38 ×

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..

hehe nanti saya buat lagi deh, itu file projectya dah ga ada hehe

Reply
avatar
21 March 2017 at 09:34 ×

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

Reply
avatar
21 March 2017 at 09:35 ×

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

Reply
avatar
Aji Setya
admin
21 March 2017 at 10:02 ×

terimakasih 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

Reply
avatar
21 March 2017 at 10:08 ×

errornya
Android Studio: InvalidVirtualFileAccessException trying to render an XML layout

apa mungkin perlu layout baru untuk menampilkan detailnya ya mas aji?

Reply
avatar
Aji Setya
admin
21 March 2017 at 10:22 ×

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..

Reply
avatar
21 March 2017 at 11:53 ×

udah mas, dan sudah mau.. masalahnya di manifest.xml nya.. karna dia class yg terpisah sama layout jd harus di deklarasikan manual..
cm 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...

Reply
avatar
Aji Setya
admin
21 March 2017 at 12:09 ×

gambarnya ga nampil ya, coba cari kode ini di class detail

Picasso.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)

Reply
avatar
21 March 2017 at 12:31 ×

udah saya buat gini mas
picasso.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

Reply
avatar
Aji Setya
admin
21 March 2017 at 12:44 ×

untuk judul sama isi beritanya muncul ga mas ? =D

Reply
avatar
21 March 2017 at 12:49 ×

gak muncul semua... yg muncul cm no_image yg digunakan untuk pesan error itu aja mas...

Reply
avatar
Aji Setya
admin
21 March 2017 at 13:27 ×

mm.. banyak kemungkinanya si mas, error yang tampil di android monitor cuma itu tadi saja mas?

Reply
avatar
21 March 2017 at 13:29 ×

iya cm itu aja errornya mas.. gak mau tampil judul desk n gambarnya...

Reply
avatar
Aji Setya
admin
21 March 2017 at 13:34 ×

susah juga kalau ga langsung liat haha :D

Reply
avatar
ahmad fachri
admin
22 March 2017 at 17:15 ×

mas bisa bikin link aplikasi nya dong mas..

Reply
avatar
Aji Setya
admin
22 March 2017 at 22:06 ×

sudah saya tambahkan mas, silahkan di sedot :-bd

Reply
avatar
Aji Setya
admin
22 March 2017 at 22:08 ×

silahkan dicek om, sudah saya tambahkan di artikel :-bd

Reply
avatar
Dwi Handono
admin
24 March 2017 at 22:51 ×

salam kenal mas Aji, saya jalankan skrip berita.php diatas kok muncul error seperti ini, kira2 error dimana ya mas ? saya menggunakan XAMPP
1.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

Reply
avatar
Aji Setya
admin
26 March 2017 at 13:16 ×

salam kenal juga mas dwi, mungkin ada simbol yang salah mas

Reply
avatar
ahmad fachri
admin
3 April 2017 at 14:02 ×

Mas untuk menampilkan action bar yang diatas pada berita_utama.xml pada saat dijalankan gimana ya?

Terus untuk memperbesar font pada listview nya gimana ya?

Reply
avatar
Rawa Tech
admin
4 April 2017 at 17:25 ×

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 ?
hpyerlink juga ga bisa, trus klo ada inputan enter malah muncul   di androidnya (json nya)

Reply
avatar
Aji Setya
admin
6 April 2017 at 06:33 ×

untuk kode html bisa menampilkanya di dalam komponen WebView, mas bisa buka di artikel saya yang terbaru

http://blogsetyaaji.blogspot.co.id/2017/04/menampilkan-kode-html-pada-webview.html

Reply
avatar
12 April 2017 at 22:03 ×

mas. saat listview di klik aplikasi langsung keluar,, yang salah dimana ya mas

Reply
avatar
Aji Setya
admin
13 April 2017 at 12:53 ×

coba buka menu android monitor mas, terus dicari error yang ada..

Reply
avatar
18 April 2017 at 22:52 ×

kaga ada mas? Sdk pengaruh gak mas

Reply
avatar
Aji Setya
admin
19 April 2017 at 05:45 ×

sdk ga ngaruh mas, tapi lebih baik kalau diliat dulu keterangan pada log android monitor agar tau kesalahanya dimana..

Reply
avatar
25 April 2017 at 09:12 ×

muncul kaya gini mas ?
Unable to obtain result of 'adb version'

Reply
avatar
nur palah
admin
25 April 2017 at 12:21 ×

mas itu untuk web nya udah CRUD belum?

Reply
avatar
nur palah
admin
25 April 2017 at 12:23 ×

maaf mas terus bagaimana mengelola data ke databsenya?

Reply
avatar
25 April 2017 at 12:37 ×

file 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..

Reply
avatar
26 April 2017 at 23:04 ×

terimakasih sudah membagi ilmu ini, saya merasa terbantu sekali.. saya doakan mas aji sukses selalu. amin

Reply
avatar
Aji Setya
admin
30 April 2017 at 06:21 ×

amin.. terimakasih dukunganya mas..

Reply
avatar
3 May 2017 at 05:41 ×

mas detail berita udah bisa di buka setelah dependencies saya ubah, tp gambar tidak muncul baik di listview maupun detail berita? solusinya mas...

Reply
avatar
Aji Setya
admin
3 May 2017 at 13:12 ×

coba dicocokin url gambarnya om.. alamat url nya kalau diakses di web muncul ga.. semoga membantu om hehe

Reply
avatar
4 May 2017 at 00:47 ×

kalo akses di web muncul mas

Reply
avatar
7 May 2017 at 23:21 ×

bang boleh minta source code project nya ga buat latihan nih, banyak error ngikutin tutor diatas :(

Reply
avatar
9 May 2017 at 02:41 ×

mas 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:

E/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)

Reply
avatar
RA04 -
admin
13 May 2017 at 13:51 ×

gan, untuk urlnya yg nnti akan diparsing bisa menggunakan url website punya org tidak ?misalkan aja nih mau memparsing data dari (www.tribunnews.com)

Reply
avatar
sipardosi
admin
15 May 2017 at 16:42 ×

terima kasih mas atas tutorial nya.

bisa kirimkan source code nya mas, mau latihan!

benni.pards@gmail.com

Reply
avatar
16 May 2017 at 11:55 ×

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?

Reply
avatar
Aji Setya
admin
16 May 2017 at 12:56 ×

untuk source codenya bisa mas download di github saya mas, link nya ada di tombol start dalam artikel itu..

Reply
avatar
Aji Setya
admin
16 May 2017 at 12:57 ×

bisa mas.. silahkan dikembangkan sesuai imajinasi mas hehe

Reply
avatar
Riswan H
admin
20 May 2017 at 17:01 ×

sore mas aji....mas kalau scripnya pakai MySQLi gimana ya mas ...bissa kasih contoj

Reply
avatar
Aji Setya
admin
20 May 2017 at 20:02 ×

sore 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

Reply
avatar
Mochamad Adi
admin
28 May 2017 at 14:48 ×

mas boleh minta projectnya ?
kirim lewat email ya mas, ini email saya mochamadadi24@gmail.com

Reply
avatar
Mochamad Adi
admin
28 May 2017 at 15:18 ×

C:\Users\ADIMAS\Documents\Project Android Studio\berita\app\src\main\java\com\example\adimas\berita\BeritaUtama.java
Error:(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();

Reply
avatar
29 May 2017 at 15:57 ×

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

Reply
avatar
Aji Setya
admin
30 May 2017 at 17:12 ×

maaf sebelumya gan, untuk file project silahkan agan download dari github saya pada tombol2 di artikel saya ini..

Reply
avatar
Aji Setya
admin
30 May 2017 at 17:20 ×

iya gan, semoga artikel dan penjelasan saya ini bisa membantu agan..

alamat 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..

Reply
avatar
LoliLove
admin
10 June 2017 at 15:21 ×

bang bagi projact ny dong gak nemu ni

Reply
avatar
18 June 2017 at 15:36 ×

tmbahin useLibrary 'org.apache.http.legacy' di bagian build.gradle (module app) nya gan

Reply
avatar
Aji Setya
admin
19 June 2017 at 10:45 ×

projectnya bisa di download di tombol 3 itu, tinggal dipilih hehe

Reply
avatar
20 June 2017 at 11:06 ×

kk, ini satu tabel satu berita atau satu tabel banyak berita?

kk, picasso itu apa ya, soalnya code error nya hanya disitu?
Terimakasih

Reply
avatar
Aji Setya
admin
20 June 2017 at 23:02 ×

ini satu table banyak berita..
picasso itu adalah sejenis librari yang digunakan untuk menampilkan gambar, untuk info lebih lanjut km bisa lihat di http://square.github.io/picasso/

semoga membantu.. 😊

Reply
avatar
Gilang
admin
28 June 2017 at 07:01 ×

kalau yang pake wordpress gimana

Reply
avatar
3 July 2017 at 11:27 ×

Kok saya ga bisa pake tipe data text ya buat field isi? Pas diganti varchar baru bisa, padahal kan field isi butuh storage yg besar

Reply
avatar
Anonymous
admin
20 July 2017 at 16:20 ×

gan misalnya ane Json-nya pake web ini https://api.kawaiibeautyjapan.com/v1/article

cara biar masing2 object array kebuka di Detail.java-nya gimana ya?

Reply
avatar
Aji Setya
admin
20 July 2017 at 20:49 ×

bisa mas, tinggal dipanggil di activity berita, terus pas buka detail dilempar sama intent.putExtra,
atau mas bisa lihat tutorial saya tentang mengirim json ke activity lain

Reply
avatar
Anonymous
admin
21 July 2017 at 11:34 ×

maksud ane manggil masing2 Object "id" yang ada di situs https://api.kawaiibeautyjapan.com/v1/article buat dipanggil di masing2 detail.java-nya

mungkin 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",

Reply
avatar
Aji Setya
admin
21 July 2017 at 23:14 ×

yang keambil data yang pertama ya, coba mas, atur di detailnya sesuai posisinya (position) kaya gini

Intent in = new Intent(getApplicationContext(), DetailBerita.class);
in.putExtra(TAG_ID, map.get(position).get(TAG_ID));
startActivity(in);

Reply
avatar
Anonymous
admin
24 July 2017 at 15:33 ×

itu .get() nya gak bisa dua gan

Reply
avatar
Anonymous
admin
24 July 2017 at 17:58 ×

ternyata object "id" ane itu Integer

malah lebih repot lagi ini

Reply
avatar
Aji Setya
admin
25 July 2017 at 06:13 ×

kalau gitu langsung aja ke get(data)

Reply
avatar
Aji Setya
admin
25 July 2017 at 06:14 ×

kalau integer berati tinggal parse aja ke integer mas pake Integer.parse

Reply
avatar
Anonymous
admin
25 July 2017 at 16:35 ×

udah bisa gan

ternyata getJSONArray ane diganti ke getJSONObject

Reply
avatar
Anonymous
admin
25 July 2017 at 19:08 ×

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.

Reply
avatar
Aji Setya
admin
26 July 2017 at 08:23 ×

sip dah.. silahkan dikembangkan mas

Reply
avatar
Aji Setya
admin
26 July 2017 at 08:24 ×

pas dijalankan coba dicek di Android Monitor mas utk tahu kesalahanya dimana

Reply
avatar
Anonymous
admin
27 July 2017 at 10:38 ×

gan, agan bisa nggak nge-debug app ini di android Lollipop kebawah?

Reply
avatar
Yogi Rizky
admin
30 July 2017 at 22:39 ×

Permisi 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,

Teks 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)

Reply
avatar
Aji Setya
admin
1 August 2017 at 21:58 ×

wah banyak banget mas, itu di kodenya ga ada yang merah mas?

Reply
avatar
Yogi Rizky
admin
4 August 2017 at 21:20 ×

gak 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 :(

tolong banget bantuannya mas, untuk skripsi soalnya :(

Reply
avatar
Aji Setya
admin
4 August 2017 at 23:50 ×

mm.. coba upload projectnya ke google drive terus linknya kirim ke saya mas hehe

Reply
avatar
Yogi Rizky
admin
6 August 2017 at 14:22 ×

Ya ampun mas, makasih banget :) siap mas!

Link: https://drive.google.com/file/d/0B-ztZ2lzuAC2U3Z6U1BRX0thYWM/view

Reply
avatar
Anonymous
admin
7 August 2017 at 15:36 ×

gan, itu app agan ada sistem pagination-nya nggak?

Reply
avatar
Aji Setya
admin
8 August 2017 at 11:33 ×

untuk artikel ini hanya menampilkan berita dalam listview aja gan.. belum pake pagination..

Reply
avatar
bayu anggoro
admin
16 August 2017 at 21:45 ×

gan kalau menampilkan jarak latitude dan longitude pada listview gmn ya caranya

Reply
avatar
Azzul Arivin
admin
18 August 2017 at 20:09 ×

gan ane kok pas masuk detail error mulu ya gan,,ni logchat ane,,

08-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?

Reply
avatar

Terimakasih atas kunjunganya.
Silahkan berkomentar dan beri kritik serta saran.
Jangan lupa difollow.

ConversionConversion EmoticonEmoticon