Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio

    Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio
    Tutorial Membuat Aplikasi Berita Indonesia Android
    السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Bagaimana kabarnya? Semoga selalu dalam keadaan sehat ya. Kali ini saya akan membagikan sebuah artikel lagi yang membahas tentang Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio. Data aplikasi berita ini saya ambil dari API News API. API ini bersifat publik dan gratis (ada kuotanya jika gratis).

    Pada sampel aplikasi berita ini, saya menyematkan beberapa topik berita antara lain :
    • Berita Utama / Headlines
    • Berita Olahraga
    • Berita Teknologi
    • Berita Bisnis
    • Berita Kesehatan
    • dan Berita Hiburan
    Fitur :
    • Menggunakan API dari News API https://newsapi.org/
    • Menggunakan Fast Android Networking untuk Rest API
    • Menggunakan Glide untuk menampilkan gambar
    • Menggunakan Webview untuk View Berita
    Menurut saya aplikasi ini bisa dijadikan bahan untuk skripsi😄. Jika kalian ingin SOURCE CODE sample aplikasi ini, silahkan download di GITHUB saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai.

    Untuk kalian yang ingin mencoba tutorial aplikasi ini dengan versi video, berikut saya berikan Videonya:

    Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

    1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.

    2. Tambahkan beberapa library di build.gradle :

    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    implementation 'com.amitshekhar.android:android-networking:1.0.2'
    }

    3. Ubah AndroidManifest.xml menjadi seperti ini :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.azhar.indonews">

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

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true"
    tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
    <activity android:name=".activities.MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    <activity
    android:name=".activities.EntertaimentActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.HealthActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.BusinessActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.TechnologyActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.HeadLineActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.SportsNewsActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".activities.OpenNewsActivity"
    android:screenOrientation="portrait" />
    </application>

    </manifest>

    4. Ubah MainActivity.java menjadi seperti ini :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;

    import android.content.Intent;
    import android.os.Bundle;
    import android.text.format.DateFormat;
    import android.view.View;
    import android.widget.TextView;

    import com.azhar.indonews.R;
    import com.google.android.material.card.MaterialCardView;

    import java.util.Calendar;
    import java.util.Date;

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    MaterialCardView cvHead, cvSports, cvTechno, cvBusiness, cvHealth, cvEntertaiment;
    TextView tvToday;
    String hariIni;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    cvHead = findViewById(R.id.cardHeadLine);
    cvSports = findViewById(R.id.cardSports);
    cvTechno = findViewById(R.id.cardTechno);
    cvBusiness = findViewById(R.id.cardBusiness);
    cvHealth = findViewById(R.id.cardHealth);
    cvEntertaiment = findViewById(R.id.cardEnter);

    cvHead.setOnClickListener(this);
    cvSports.setOnClickListener(this);
    cvTechno.setOnClickListener(this);
    cvBusiness.setOnClickListener(this);
    cvHealth.setOnClickListener(this);
    cvEntertaiment.setOnClickListener(this);

    tvToday = findViewById(R.id.tvDate);
    Date dateNow = Calendar.getInstance().getTime();
    hariIni = (String) DateFormat.format("EEEE", dateNow);
    if (hariIni.equalsIgnoreCase("sunday")) {
    hariIni = "Minggu";
    } else if (hariIni.equalsIgnoreCase("monday")) {
    hariIni = "Senin";
    } else if (hariIni.equalsIgnoreCase("tuesday")) {
    hariIni = "Selasa";
    } else if (hariIni.equalsIgnoreCase("wednesday")) {
    hariIni = "Rabu";
    } else if (hariIni.equalsIgnoreCase("thursday")) {
    hariIni = "Kamis";
    } else if (hariIni.equalsIgnoreCase("friday")) {
    hariIni = "Jumat";
    } else if (hariIni.equalsIgnoreCase("saturday")) {
    hariIni = "Sabtu";
    }

    getToday();

    }

    private void getToday() {
    Date date = Calendar.getInstance().getTime();
    String tanggal = (String) DateFormat.format("d", date);
    String monthNumber = (String) DateFormat.format("M", date);
    String year = (String) DateFormat.format("yyyy", date);

    int month = Integer.parseInt(monthNumber);
    String bulan = null;
    if (month == 1) {
    bulan = "Januari";
    } else if (month == 2) {
    bulan = "Februari";
    } else if (month == 3) {
    bulan = "Maret";
    } else if (month == 4) {
    bulan = "April";
    } else if (month == 5) {
    bulan = "Mei";
    } else if (month == 6) {
    bulan = "Juni";
    } else if (month == 7) {
    bulan = "Juli";
    } else if (month == 8) {
    bulan = "Agustus";
    } else if (month == 9) {
    bulan = "September";
    } else if (month == 10) {
    bulan = "Oktober";
    } else if (month == 11) {
    bulan = "November";
    } else if (month == 12) {
    bulan = "Desember";
    }
    String formatFix = hariIni + ", " + tanggal + " " + bulan + " " + year;
    tvToday.setText(formatFix);
    }

    @Override
    public void onClick(View v) {
    if (v.getId() == R.id.cardHeadLine) {
    Intent intent = new Intent(MainActivity.this, HeadLineActivity.class);
    startActivity(intent);
    } else if (v.getId() == R.id.cardSports) {
    Intent intent = new Intent(MainActivity.this, SportsNewsActivity.class);
    startActivity(intent);
    } else if (v.getId() == R.id.cardTechno) {
    Intent intent = new Intent(MainActivity.this, TechnologyActivity.class);
    startActivity(intent);
    } else if (v.getId() == R.id.cardBusiness) {
    Intent intent = new Intent(MainActivity.this, BusinessActivity.class);
    startActivity(intent);
    } else if (v.getId() == R.id.cardHealth) {
    Intent intent = new Intent(MainActivity.this, HealthActivity.class);
    startActivity(intent);
    } else if (v.getId() == R.id.cardEnter) {
    Intent intent = new Intent(MainActivity.this, EntertaimentActivity.class);
    startActivity(intent);
    }
    }

    }

    5. Untuk tampilan menu utama, buat activity_main.xml dan item_main_grid.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
    android:id="@+id/toolbarMain"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_home_wave"
    android:fitsSystemWindows="true">

    <RelativeLayout
    android:id="@+id/rlAppName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start|center">

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_marginStart="10dp"
    android:text="@string/title_header_main"
    android:textColor="@android:color/white"
    android:textSize="16sp" />

    </RelativeLayout>

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cvDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|center"
    android:layout_marginEnd="-20dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="5dp">

    <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
    android:id="@+id/imgDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="5dp"
    android:src="@drawable/ic_date" />

    <TextView
    android:id="@+id/tvDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_marginStart="5dp"
    android:layout_marginEnd="25dp"
    android:layout_toEndOf="@id/imgDate"
    android:text="Minggu, 20 Oktober 2020"
    android:textColor="@color/colorPrimary"
    android:textSize="12sp" />

    </RelativeLayout>

    </com.google.android.material.card.MaterialCardView>

    </FrameLayout>

    <LinearLayout
    android:id="@+id/llCurved"
    android:layout_width="match_parent"
    android:layout_height="25dp"
    android:layout_below="@+id/toolbarMain"
    android:background="@drawable/bg_home_curve"
    android:orientation="horizontal" />

    <include layout="@layout/item_main_grid" />

    <TextView
    android:id="@+id/appName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerInParent="true"
    android:elevation="5dp"
    android:text="Apps Berita Indonesia by Azhar Rivaldi"
    android:textColor="@color/colorAccent"
    android:textSize="10sp" />

    </RelativeLayout>


    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/llCurved">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardHeadLine"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@android:color/holo_orange_light"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_headlines"
    android:tint="@android:color/holo_orange_light" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Berita Utama"
    android:textColor="@android:color/holo_orange_light"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@android:color/holo_orange_light" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@android:color/holo_orange_light" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardSports"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@android:color/holo_red_dark"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_sports"
    android:tint="@android:color/holo_red_dark" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Olahraga"
    android:textColor="@android:color/holo_red_dark"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@android:color/holo_red_dark" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@android:color/holo_red_dark" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    </LinearLayout>

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardTechno"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@android:color/holo_purple"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_technology"
    android:tint="@android:color/holo_purple" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Teknologi"
    android:textColor="@android:color/holo_purple"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@android:color/holo_purple" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@android:color/holo_purple" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardBusiness"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@android:color/black"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_business"
    android:tint="@android:color/black" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Bisnis"
    android:textColor="@android:color/black"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@android:color/black" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@android:color/black" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    </LinearLayout>

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardHealth"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@android:color/holo_green_dark"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_health"
    android:tint="@android:color/holo_green_dark" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Kesehatan"
    android:textColor="@android:color/holo_green_dark"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@android:color/holo_green_dark" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@android:color/holo_green_dark" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cardEnter"
    android:layout_width="150.0dip"
    android:layout_height="150.0dip"
    android:layout_margin="10dp"
    app:cardCornerRadius="10.0dip"
    app:cardElevation="5.0dip"
    app:strokeColor="@color/colorPrimary"
    app:strokeWidth="2.0dip">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
    android:layout_width="64dp"
    android:layout_height="64dp"
    android:padding="10dp"
    android:src="@drawable/ic_entertaiment"
    android:tint="@color/colorPrimary" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Hiburan"
    android:textColor="@color/colorPrimary"
    android:textStyle="bold" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <View
    android:layout_width="100dp"
    android:layout_height="3dp"
    android:background="@color/colorPrimary" />

    <View
    android:layout_width="10dp"
    android:layout_height="3dp"
    android:layout_marginStart="3dp"
    android:background="@color/colorPrimary" />

    </LinearLayout>

    </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    </LinearLayout>

    </LinearLayout>

    </ScrollView>

    6. Buat Class BusinessActivity.java untuk berita bisnis :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class BusinessActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvBusiness;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvBusiness = findViewById(R.id.rvNews);
    rvBusiness.setHasFixedSize(true);
    rvBusiness.setLayoutManager(new LinearLayoutManager(this));

    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Bisnis");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_CATEGORY_BUSINESS)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(BusinessActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(BusinessActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(BusinessActivity.this, modelNews, this);
    rvBusiness.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(BusinessActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }

    }

    7. Buat Class EntertaimentActivity.java untuk berita hiburan :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class EntertaimentActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvEntertaiment;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvEntertaiment = findViewById(R.id.rvNews);
    rvEntertaiment.setHasFixedSize(true);
    rvEntertaiment.setLayoutManager(new LinearLayoutManager(this));
    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Hiburan");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_CATEGORY_ENTERTAINMENT)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(EntertaimentActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(EntertaimentActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(EntertaimentActivity.this, modelNews, this);
    rvEntertaiment.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(EntertaimentActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }

    }

    8. Buat Class HeadLineActivity.java untuk berita utama :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class HeadLineActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvHeadNews;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvHeadNews = findViewById(R.id.rvNews);
    rvHeadNews.setHasFixedSize(true);
    rvHeadNews.setLayoutManager(new LinearLayoutManager(this));
    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Utama");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_TOP_HEADLINES)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(HeadLineActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(HeadLineActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(HeadLineActivity.this, modelNews, this);
    rvHeadNews.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(HeadLineActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }
    }


    9. Buat Class HealthActivity.java untuk berita kesehatan :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class HealthActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvHealth;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvHealth = findViewById(R.id.rvNews);
    rvHealth.setHasFixedSize(true);
    rvHealth.setLayoutManager(new LinearLayoutManager(this));
    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Kesehatan");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_CATEGORY_HEALTH)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(HealthActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(HealthActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(HealthActivity.this, modelNews, this);
    rvHealth.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(HealthActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }

    }

    10. Buat Class SportsNewsActivity.java untuk berita olahraga :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class SportsNewsActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvSportNews;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvSportNews = findViewById(R.id.rvNews);
    rvSportNews.setHasFixedSize(true);
    rvSportNews.setLayoutManager(new LinearLayoutManager(this));
    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Olahraga");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_CATEGORY_SPORTS)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(SportsNewsActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(SportsNewsActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(SportsNewsActivity.this, modelNews, this);
    rvSportNews.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(SportsNewsActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }

    }

    11. Yang terakhir buat Class TechnologyActivity.java untuk berita teknologi :

    package com.azhar.indonews.activities;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.widget.Toast;

    import com.androidnetworking.AndroidNetworking;
    import com.androidnetworking.common.Priority;
    import com.androidnetworking.error.ANError;
    import com.androidnetworking.interfaces.JSONObjectRequestListener;
    import com.azhar.indonews.R;
    import com.azhar.indonews.adapter.NewsAdapter;
    import com.azhar.indonews.api.NewsApi;
    import com.azhar.indonews.model.ModelNews;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.List;

    public class TechnologyActivity extends AppCompatActivity implements NewsAdapter.onSelectData {

    RecyclerView rvTechno;
    NewsAdapter newsAdapter;
    List modelNews = new ArrayList<>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);

    progressDialog = new ProgressDialog(this);
    progressDialog.setTitle("Mohon tunggu");
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Sedang menampilkan data");

    rvTechno = findViewById(R.id.rvNews);
    rvTechno.setHasFixedSize(true);
    rvTechno.setLayoutManager(new LinearLayoutManager(this));
    setupToolbar();
    loadJSON();
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbNews);
    toolbar.setTitle("Berita Teknologi");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    private void loadJSON() {
    progressDialog.show();
    AndroidNetworking.get(NewsApi.GET_CATEGORY_TECHNOLOGY)
    .setPriority(Priority.HIGH)
    .build()
    .getAsJSONObject(new JSONObjectRequestListener() {
    @Override
    public void onResponse(JSONObject response) {
    try {
    progressDialog.dismiss();
    JSONArray playerArray = response.getJSONArray("articles");
    for (int i = 0; i < playerArray.length(); i++) {
    JSONObject temp = playerArray.getJSONObject(i);
    ModelNews dataApi = new ModelNews();
    dataApi.setTitle(temp.getString("title"));
    dataApi.setUrl(temp.getString("url"));
    dataApi.setPublishedAt(temp.getString("publishedAt"));
    dataApi.setUrlToImage(temp.getString("urlToImage"));

    modelNews.add(dataApi);
    showNews();
    }
    } catch (JSONException e) {
    e.printStackTrace();
    Toast.makeText(TechnologyActivity.this, "Gagal menampilkan data!", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onError(ANError anError) {
    progressDialog.dismiss();
    Toast.makeText(TechnologyActivity.this, "Tidak ada jaringan internet!", Toast.LENGTH_SHORT).show();
    }
    });
    }

    private void showNews() {
    newsAdapter = new NewsAdapter(TechnologyActivity.this, modelNews, this);
    rvTechno.setAdapter(newsAdapter);
    }

    @Override
    public void onSelected(ModelNews mdlNews) {
    startActivity(new Intent(TechnologyActivity.this, OpenNewsActivity.class).putExtra("url", mdlNews.getUrl()));
    }

    }

    12. Untuk menampilkan berita-berita dari source diatas, buat activity_news.xml. Disini saya menggunakan satu XML untuk digunakan beberapa source java berita tadi :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
    android:id="@+id/tbNews"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:orientation="vertical"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    <androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rvNews"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical" />

    </LinearLayout>

    13. Buat Class OpenNewsActivity.java dan activity_open_news.xml untuk menampilkan detail berita :

    package com.azhar.indonews.activities;

    import android.annotation.SuppressLint;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;

    import com.azhar.indonews.R;

    /**
    * Created by Azhar Rivaldi on 22-12-2019.
    */

    public class OpenNewsActivity extends AppCompatActivity {

    private ProgressBar mProgressBar;
    private WebView mWebView;

    String url = "https://www.google.com";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //android theme
    setContentView(R.layout.activity_open_news);

    //android toolbar
    setupToolbar();

    mProgressBar = findViewById(R.id.progress_bar);
    mProgressBar.setMax(100);
    url = getIntent().getStringExtra("url");

    mWebView = findViewById(R.id.read_news);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl(url);
    mProgressBar.setProgress(0);
    mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String newUrl) {
    view.loadUrl(newUrl);
    mProgressBar.setProgress(0);
    return true;
    }

    @Override
    public void onPageStarted(WebView view, String urlStart, Bitmap favicon) {
    //mProgressBar.setProgress(0);
    url = urlStart;
    invalidateOptionsMenu();

    }

    @Override
    public void onPageFinished(WebView view, String urlPage) {
    mProgressBar.setVisibility(View.GONE);
    invalidateOptionsMenu();
    }
    });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_open_news, menu);
    return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.share) {//share news
    shareUrl(url);
    }
    return super.onOptionsItemSelected(item);
    }

    //back pressed
    @Override
    public void onBackPressed() {
    if (mWebView.canGoBack()) {
    mWebView.goBack();
    } else {
    super.onBackPressed();
    }
    }

    //setup toolbar
    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbOpenNews);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (mWebView.canGoBack()) {
    mWebView.goBack();
    } else {
    finish();
    }
    }
    });
    }

    //share news
    private void shareUrl(String url) {
    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    share.putExtra(Intent.EXTRA_TEXT, url);
    startActivity(Intent.createChooser(share, "Bagikan ke : "));
    }
    }


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <com.google.android.material.card.MaterialCardView
    android:id="@+id/cvNews"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="3dp"
    app:strokeColor="@color/colorPrimary"
    app:strokeWidth="2dp">

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="3dp"
    android:orientation="horizontal">

    <RelativeLayout
    android:id="@+id/rl_imgList"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_centerInParent="true">

    <ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

    <ImageView
    android:id="@+id/image"
    android:layout_width="150dp"
    android:layout_height="100dp"
    android:src="@drawable/ic_image_list" />

    </RelativeLayout>

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_toEndOf="@id/rl_imgList"
    android:orientation="vertical"
    android:padding="5dp">

    <TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:text="Title"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textSize="12sp" />

    <TextView
    android:id="@+id/publishedAt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:singleLine="true"
    android:text="Time"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textSize="8sp" />

    </LinearLayout>

    </RelativeLayout>

    </com.google.android.material.card.MaterialCardView>

    </LinearLayout>

    14. Buat Class NewsApi.java untuk API-nya :

    package com.azhar.indonews.api;

    public class NewsApi {
    public static String GET_TOP_HEADLINES = "https://newsapi.org/v2/top-headlines?country=id&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    public static String GET_CATEGORY_SPORTS = "https://newsapi.org/v2/top-headlines?country=id&category=sports&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    public static String GET_CATEGORY_TECHNOLOGY = "https://newsapi.org/v2/top-headlines?country=id&category=technology&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    public static String GET_CATEGORY_BUSINESS = "https://newsapi.org/v2/top-headlines?country=id&category=business&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    public static String GET_CATEGORY_HEALTH = "https://newsapi.org/v2/top-headlines?country=id&category=health&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    public static String GET_CATEGORY_ENTERTAINMENT = "https://newsapi.org/v2/top-headlines?country=id&category=entertainment&apiKey=f3aa09e2f1d7494e9fded68f30d4e4c1";
    }

    15. Untuk holdernya, buat Class NewsViewHolder.java :

    package com.azhar.indonews.holder;

    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;

    import androidx.recyclerview.widget.RecyclerView;

    import com.azhar.indonews.R;
    import com.google.android.material.card.MaterialCardView;

    /**
    * Created by Azhar Rivaldi on 22-12-2019.
    */
    public class NewsViewHolder extends RecyclerView.ViewHolder {

    public ImageView image;
    public TextView title;
    public TextView publishedAt;
    public MaterialCardView cvNews;
    public View view;

    public NewsViewHolder(View view) {
    super(view);

    cvNews = view.findViewById(R.id.cvNews);
    image = view.findViewById(R.id.image);
    title = view.findViewById(R.id.title);
    publishedAt = view.findViewById(R.id.publishedAt);
    this.view = view;
    }
    }

    16. Untuk modelnya, buat Class ModelNews.java :

    package com.azhar.indonews.model;

    /**
    * Created by Azhar Rivaldi on 22-12-2019.
    */
    public class ModelNews {

    private String title;
    private String publishedAt;
    private String url;
    private String urlToImage;

    public void setTitle(String title) {
    this.title = title;
    }

    public void setPublishedAt(String publishedAt) {
    this.publishedAt = publishedAt;
    }

    public void setUrl(String url) {
    this.url = url;
    }

    public void setUrlToImage(String urlToImage) {
    this.urlToImage = urlToImage;
    }

    public String getTitle() {
    return title;
    }

    public String getPublishedAt() {
    return publishedAt;
    }

    public String getUrl() {
    return url;
    }

    public String getUrlToImage() {
    return urlToImage;
    }
    }


    17. Terakhir, buat Class TimeUnits.java untuk konvert waktu berita dari API :

    package com.azhar.indonews.utils;

    import java.util.Calendar;

    public class TimeUnits {
    //convert timestamp to time ago
    public static String getTimeAgo(String timeStamp) {
    String timeAgo = "";

    String[] date = timeStamp.replace("T", "-")
    .replace("Z", "-")
    .replace(":", "-")
    .split("-");

    int year_a = Integer.parseInt(date[0]);
    int month_a = Integer.parseInt(date[1]);
    int day_a = Integer.parseInt(date[2]);
    int hour_a = Integer.parseInt(getHour(date[3]));
    int minute_a = Integer.parseInt(date[4]);
    //calendar a / time a (last time / published at )
    Calendar cal_a = Calendar.getInstance();
    cal_a.set(year_a, month_a, day_a, hour_a, minute_a);

    //calendar b / time b (time now)
    Calendar cal_b = Calendar.getInstance();
    int year_b = cal_b.get(Calendar.YEAR);
    int month_b = cal_b.get(Calendar.MONTH) + 1;
    int day_b = cal_b.get(Calendar.DAY_OF_MONTH);
    int hour_b = cal_b.get(Calendar.HOUR_OF_DAY);
    int minute_b = cal_b.get(Calendar.MINUTE);
    cal_b.set(year_b, month_b, day_b, hour_b, minute_b);

    final long MILIDETIK_SATU_MENIT = 60 * 1000;

    long wA = cal_a.getTimeInMillis();
    long wB = cal_b.getTimeInMillis();
    //selisih
    long selisih = wB - wA;
    int selisih_menit = (int) (selisih / MILIDETIK_SATU_MENIT);
    if (selisih_menit > 0) {
    if (selisih_menit > 60 && selisih_menit < 1440) {
    int jam = selisih_menit / 60;
    timeAgo = jam + " jam yang lalu";
    } else if (selisih_menit > 1440) {
    int hari = selisih_menit / 1440;
    timeAgo = hari + " hari yang lalu";
    } else {
    timeAgo = selisih_menit + " menit yang lalu";
    }
    }
    return timeAgo;
    }

    public static String getHour(String hour) {
    String result = "";
    if (hour.equals("00")) {
    result = "07";
    } else if (hour.equals("01")) {
    result = "08";
    } else if (hour.equals("02")) {
    result = "09";
    } else if (hour.equals("03")) {
    result = "10";
    } else if (hour.equals("04")) {
    result = "11";
    } else if (hour.equals("05")) {
    result = "12";
    } else if (hour.equals("06")) {
    result = "13";
    } else if (hour.equals("07")) {
    result = "14";
    } else if (hour.equals("08")) {
    result = "15";
    } else if (hour.equals("09")) {
    result = "16";
    } else if (hour.equals("10")) {
    result = "17";
    } else if (hour.equals("11")) {
    result = "18";
    } else if (hour.equals("12")) {
    result = "19";
    } else if (hour.equals("13")) {
    result = "20";
    } else if (hour.equals("14")) {
    result = "21";
    } else if (hour.equals("15")) {
    result = "22";
    } else if (hour.equals("16")) {
    result = "23";
    } else if (hour.equals("17")) {
    result = "00";
    } else if (hour.equals("18")) {
    result = "01";
    } else if (hour.equals("19")) {
    result = "02";
    } else if (hour.equals("20")) {
    result = "03";
    } else if (hour.equals("21")) {
    result = "04";
    } else if (hour.equals("22")) {
    result = "05";
    } else if (hour.equals("23")) {
    result = "06";
    }
    return result;
    }
    }

    18. Selesai dan kalian Run. Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

    Untuk hasilnya nanti akan seperti ini :
    Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio
    Tutorial Membuat Aplikasi Berita Indonesia
    Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio
    Tutorial Membuat Aplikasi Berita Indonesia
    Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Aplikasi Berita Indonesia dengan Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_