Android Retrofit2 Tutorial - Menampilkan Data Dari Database Ke Recyclerview (Http Get)



Retrofit ialah sebuah library REST Client yang gampang digunakan, Retrofit ini sendiri memanfaatkan REST Server yang menyadiakan resources yang direpresentasikan ke dalam bentuk Text, JSON maupun XML. dan kali ini yang akan kita gunakan yaitu JSON, dimana JSON sendiri ialah format yang paling sering dipakai untuk mentransmisikan data terstruktur melalui suatu koneksi jaringan di dalam proses yang disebut serialisasi. 

Android Retrofit2 Tutorial - Menampilkan data dari Database ke RecyclerView (HTTP GET) 


Persiapan Server


Sebelum memulai, persiapan yang harus dilakukan yaitu kita harus meyiapkan Webserver menyerupai Xampp, Wampp dll. kemudian :

1. Membuat database. Buat database dengan nama users
kemudian instruksi dibawah ini ialah tabelnya
                                                                                          -- -- Struktur dari tabel `users` --  CREATE TABLE `users` (   `id` mediumint(8) UNSIGNED NOT NULL,   `name` varchar(255) DEFAULT NULL,   `email` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

2. Mengisikan data ke database Supaya sanggup eksklusif ditampilkan nantinya (gausah input satu persatu, kita masukin dulu deh data yang akan ditampilkan).
Walaupun nantinya kita juga akan menciptakan cara input data ke database memakai retrofit2, tapi itu nanti.
                                                                                          -- -- Dumping data untuk tabel `users` --  INSERT INTO `users` (`id`, `name`, `email`) VALUES (1, 'Plato Floydo', 'neque.vitae@purussapiengravida.ca'), (2, 'Sawyer Gonzalez', 'Aliquam.rutrum@auctorvitaealiquet.edu'), (3, 'Zachary Schmidt', 'pharetra.ut@nisisem.ca'), (4, 'Cyrus Mason', 'risus.at@arcuSed.ca'), (5, 'Julian Houston', 'mauris.Suspendisse@semconsequatnec.com'), (6, 'Kane Mcdowell', 'ac.feugiat@id.co.uk'), (7, 'Isaac Fowler', 'neque.sed.sem@et.ca'), (8, 'Galvin Austin', 'iaculis@ridiculusmus.net'), (9, 'Thor Cabrera', 'vestibulum.lorem@Donecnon.co.uk'), (10, 'Kieran Foster', 'eget.dictum.placerat@Maurisvelturpis.co.uk'), (11, 'Norman Stephens', 'commodo.hendrerit.Donec@montes.edu'), (12, 'Ulric Richard', 'dapibus@velturpis.edu'), (13, 'Cyrus Lee', 'varius.et.euismod@Nulla.edu'), (14, 'Lucas Acosta', 'primis.in@anteblanditviverra.org'), (15, 'Damian Gutierrez', 'mauris.Integer@molestiein.net'), (16, 'Declan Gray', 'Sed.eu.eros@arcu.ca'), (17, 'Trevor Koch', 'malesuada.ut.sem@euturpis.ca'), (18, 'Odysseus Reese', 'quam.quis@etultricesposuere.com'), (19, 'Thomas Willis', 'leo.in.lobortis@Aliquamgravida.ca'), (20, 'Gary Mercado', 'mi.felis.adipiscing@nibhsitamet.ca'), (21, 'Roth Carver', 'mollis@pedenecante.com'), (22, 'Ryan Ashley', 'placerat.orci.lacus@Fuscealiquetmagna.net'), (23, 'Quentin Berger', 'tincidunt@urnanecluctus.edu'), (24, 'Griffin Cervantes', 'sit.amet.consectetuer@utpellentesque.com'), (25, 'Cade Mckee', 'Mauris.vel@arcu.ca'), (26, 'Martin Erickson', 'nisi.a@esttempor.net'), (27, 'Tanner Hale', 'risus.varius@convalliserat.com'), (28, 'Dillon Levine', 'Aenean.euismod@ipsumnon.co.uk'), (29, 'Bevis West', 'Quisque.varius.Nam@nuncsitamet.ca'), (30, 'Giacomo Hensley', 'Integer@justonec.ca'), (31, 'Palmer Gross', 'tincidunt@Pellentesque.net'), (32, 'Castor Vance', 'amet.dapibus@massarutrummagna.co.uk'), (33, 'Warren Case', 'Nunc.lectus@vulputate.edu'), (34, 'Dalton Tillman', 'leo.Vivamus.nibh@Fusce.net'), (35, 'Hu Clayton', 'et.euismod@at.org'), (36, 'Sylvester Nolan', 'Proin.velit@sagittissemperNam.com'), (37, 'Harper Palmer', 'Nunc.sed@faucibus.ca'), (38, 'Zeph Washington', 'pretium.neque.Morbi@Nulla.org'), (39, 'Julian Neal', 'Nunc@diamvel.net'), (40, 'Hiram Newton', 'primis.in@sedorcilobortis.com'), (41, 'August Banks', 'odio.Etiam@urna.org'), (42, 'Basil Garrison', 'elit@enimsit.edu'), (43, 'Buckminster Nelson', 'quis.turpis.vitae@adipiscing.com'), (44, 'Lane Benjamin', 'aliquam@semper.net'), (45, 'Burke Gordon', 'ac@vulputateduinec.net'), (46, 'Logan Harris', 'gravida@Curabituregestas.edu'), (47, 'Barry Hansen', 'Donec.dignissim@ornarelectus.org'), (48, 'Jared Mckenzie', 'ante.dictum@duiFusce.edu'), (49, 'Timon Bruce', 'neque.pellentesque@quistristiqueac.edu'), (50, 'Jordan Gross', 'Proin.vel.arcu@felispurus.net'), (51, 'Rudyard Sparks', 'montes@maurisid.com'), (52, 'Abraham Wong', 'orci.Phasellus.dapibus@Proin.org'), (53, 'Barrett Glenn', 'suscipit@nunc.ca'), (54, 'Ciaran Snyder', 'ipsum@turpisAliquam.edu'), (55, 'Carl Golden', 'Aliquam@atsem.co.uk'), (56, 'Leroy Pollard', 'Etiam@loremipsumsodales.com'), (57, 'Garth Burch', 'est.congue@Namconsequat.com'), (58, 'Lane Huff', 'malesuada.vel.venenatis@dolorDonec.co.uk'), (59, 'Gray Kirkland', 'et.eros.Proin@nonantebibendum.com'), (60, 'Bert Forbes', 'adipiscing@gravida.com'), (61, 'Elvis Jenkins', 'arcu.Vivamus@aliquetvel.ca'), (62, 'Mark Knox', 'leo.Vivamus.nibh@arcuVestibulumut.net'), (63, 'Lance Colon', 'congue@ipsumporta.org'), (64, 'Vladimir Hansen', 'et.commodo@torquentperconubia.co.uk'), (65, 'Wade Barton', 'nibh@DuisgravidaPraesent.co.uk'), (66, 'Dante Molina', 'consectetuer.adipiscing@ipsumdolorsit.co.uk'), (67, 'Charles Hudson', 'tempor@turpisnonenim.edu'), (68, 'Elton Kane', 'Sed@luctusutpellentesque.co.uk'), (69, 'Abel Frank', 'posuere.vulputate.lacus@etmagnis.com'), (70, 'Garrett Aguilar', 'aliquet.odio.Etiam@nibhdolornonummy.ca'), (71, 'Lester Hendricks', 'mauris@ategestas.edu'), (72, 'Elmo Franks', 'Sed.eu.nibh@venenatislacusEtiam.com'), (73, 'Randall Anderson', 'Mauris.vestibulum@sapien.ca'), (74, 'Jackson Buckley', 'dui.Cum.sociis@nonleoVivamus.edu'), (75, 'George Mercado', 'non.lacinia@sitamet.com'), (76, 'Prescott Bradley', 'a.odio@inconsectetuer.edu'), (77, 'Wallace Downs', 'odio.auctor@ornare.edu'), (78, 'Vladimir Mcintosh', 'eget.massa@enimgravida.org'), (79, 'Dennis Hull', 'Mauris.non.dui@leo.ca'), (80, 'Keefe Short', 'fermentum.vel.mauris@Phasellusvitaemauris.org'), (81, 'Xanthus Hampton', 'Sed@Etiam.com'), (82, 'Gregory Bishop', 'magnis@Sedeget.com'), (83, 'Basil Acosta', 'enim.diam.vel@purusactellus.net'), (84, 'Griffith Weiss', 'ante@rhoncusNullam.com'), (85, 'Nash Mcdowell', 'commodo@ante.ca'), (86, 'Phelan Gilbert', 'natoque.penatibus.et@fames.com'), (87, 'Devin Gregory', 'sed.hendrerit@bibendumDonecfelis.edu'), (88, 'Jelani Marquez', 'leo@mollis.ca'), (89, 'Kadeem Harper', 'sapien@enimEtiamimperdiet.net'), (90, 'Shad Tyson', 'mauris@duiCum.net'), (91, 'Nigel Cole', 'aliquet.odio.Etiam@dictumeu.net'), (92, 'Jerry Short', 'Nam@sitametconsectetuer.ca'), (93, 'Josiah Chase', 'Aenean.massa.Integer@in.net'), (94, 'Chaim Alvarado', 'ultricies@varius.net'), (95, 'Victor Manning', 'est.Mauris@blandit.ca'), (96, 'Caldwell Marks', 'a.nunc@amet.com'), (97, 'Burke Colon', 'lacus.vestibulum.lorem@euelit.co.uk'), (98, 'Keane Molina', 'adipiscing.Mauris@dolornonummy.org'), (99, 'Theodore Hutchinson', 'id@dignissimmagna.edu'), (100, 'Griffin Gates', 'imperdiet.nec@Donec.net'), (107, 'Haerul Muttaqin', 'haerul@mail.com');  
Pastikan database kalian sudah menyerupai ini :


Kalo database sudah siap kita lanjut pada pembuatan php


3. Pembuatan file PHP
PHP ini lah yang akan menkoneksikan ke database hingga PHP pula yang akan menyebarkan JSON untuk client, dan nantinya yang akan di olah lagi oleh android yang dihubungkan melalui jaringan koneksi.
  • Buat folder dengan nama retrofit di direktori htdocs
  • Kemudian buat file PHP dengan nama connect.php di direktori retrofit file ini yang akan mengkoneksikan php dengan database mysql anda

instruksi dibawah ini ialah untuk file connect.php
dan dangan lupa mengubah define dan sesuaikan dengan server kalian.
                                                                                           //connect.php  &lt?php   define('hostname','localhost'); define('username', 'root'); define('password', ''); define('database', 'users');  $conn = mysqli_connect(hostname, username, password, database) or die('Unable to connect');  ?&gt  

Kemudian,
  • Buat file gres dengan nama getcontacts.php di direktori retrofit
File ini yang akan meminta data ke database kemudian menghasilkan data array dari hasil permintaan, dan kemudian disajikan kedalam bentuk JSON.
instruksi dibawah ini ialah untuk file getcontacts.php.php
                                                                                          //getcontact.php &lt?php  require_once 'connect.php';  $type = $_GET['item_type']; // menyidik data yang dikirim melalui GET  if ($type == 'users') { // jikalau $_GET['item_type'] yaitu users, maka akan menjalankan instruksi dibawahnya      $query = "SELECT * FROM users";     $result = mysqli_query($conn, $query);      $response = array();      while( $row = mysqli_fetch_assoc($result) ){ // perulangan dari fetching asosiativ          array_push($response,         array(             'id'=>$row['id'],              'name'=>$row['name'],              'email'=>$row['email'])          );     }      echo json_encode($response);  // enchoding kedalam JSON dari array }  mysqli_close($conn); // menutup koneksi mysql  ?&gt 
Makara kalo file getcontact.php ini dijalankan akan menghasilkan data JSON :
kalian sanggup panggil ini untuk mencoba menjalankannya
http://localhost/retrofit/getcontact.php?item_type=users

Kalo karenanya udah kayak gini :
                                                                                          [   {     "id": "1",     "name": "Plato Floydo",     "email": "neque.vitae@purussapiengravida.ca"   },   {     "id": "2",     "name": "Sawyer Gonzalez",     "email": "Aliquam.rutrum@auctorvitaealiquet.edu"   },   {     "id": "3",     "name": "Zachary Schmidt",     "email": "pharetra.ut@nisisem.ca"   },   {     "id": "4",     "name": "Cyrus Mason",     "email": "risus.at@arcuSed.ca"   },   {     "id": "5",     "name": "Julian Houston",     "email": "mauris.Suspendisse@semconsequatnec.com"   },   {     "id": "6",     "name": "Kane Mcdowell",     "email": "ac.feugiat@id.co.uk"   },   {     "id": "7",     "name": "Isaac Fowler",     "email": "neque.sed.sem@et.ca"   },   {     "id": "8",     "name": "Galvin Austin",     "email": "iaculis@ridiculusmus.net"   },   {     "id": "9",     "name": "Thor Cabrera",     "email": "vestibulum.lorem@Donecnon.co.uk"   },   {     "id": "10",     "name": "Kieran Foster",     "email": "eget.dictum.placerat@Maurisvelturpis.co.uk"   },   {     "id": "11",     "name": "Norman Stephens",     "email": "commodo.hendrerit.Donec@montes.edu"   },   {     "id": "12",     "name": "Ulric Richard",     "email": "dapibus@velturpis.edu"   },   {     "id": "13",     "name": "Cyrus Lee",     "email": "varius.et.euismod@Nulla.edu"   },   {     "id": "14",     "name": "Lucas Acosta",     "email": "primis.in@anteblanditviverra.org"   },   {     "id": "15",     "name": "Damian Gutierrez",     "email": "mauris.Integer@molestiein.net"   },   {     "id": "16",     "name": "Declan Gray",     "email": "Sed.eu.eros@arcu.ca"   },   {     "id": "17",     "name": "Trevor Koch",     "email": "malesuada.ut.sem@euturpis.ca"   },   {     "id": "18",     "name": "Odysseus Reese",     "email": "quam.quis@etultricesposuere.com"   },   {     "id": "19",     "name": "Thomas Willis",     "email": "leo.in.lobortis@Aliquamgravida.ca"   },   {     "id": "20",     "name": "Gary Mercado",     "email": "mi.felis.adipiscing@nibhsitamet.ca"   },   {     "id": "21",     "name": "Roth Carver",     "email": "mollis@pedenecante.com"   },   {     "id": "22",     "name": "Ryan Ashley",     "email": "placerat.orci.lacus@Fuscealiquetmagna.net"   },   {     "id": "23",     "name": "Quentin Berger",     "email": "tincidunt@urnanecluctus.edu"   },   {     "id": "24",     "name": "Griffin Cervantes",     "email": "sit.amet.consectetuer@utpellentesque.com"   },   {     "id": "25",     "name": "Cade Mckee",     "email": "Mauris.vel@arcu.ca"   },   {     "id": "26",     "name": "Martin Erickson",     "email": "nisi.a@esttempor.net"   },   {     "id": "27",     "name": "Tanner Hale",     "email": "risus.varius@convalliserat.com"   },   {     "id": "28",     "name": "Dillon Levine",     "email": "Aenean.euismod@ipsumnon.co.uk"   },   {     "id": "29",     "name": "Bevis West",     "email": "Quisque.varius.Nam@nuncsitamet.ca"   },   {     "id": "30",     "name": "Giacomo Hensley",     "email": "Integer@justonec.ca"   },   {     "id": "31",     "name": "Palmer Gross",     "email": "tincidunt@Pellentesque.net"   },   {     "id": "32",     "name": "Castor Vance",     "email": "amet.dapibus@massarutrummagna.co.uk"   },   {     "id": "33",     "name": "Warren Case",     "email": "Nunc.lectus@vulputate.edu"   },   {     "id": "34",     "name": "Dalton Tillman",     "email": "leo.Vivamus.nibh@Fusce.net"   },   {     "id": "35",     "name": "Hu Clayton",     "email": "et.euismod@at.org"   },   {     "id": "36",     "name": "Sylvester Nolan",     "email": "Proin.velit@sagittissemperNam.com"   },   {     "id": "37",     "name": "Harper Palmer",     "email": "Nunc.sed@faucibus.ca"   },   {     "id": "38",     "name": "Zeph Washington",     "email": "pretium.neque.Morbi@Nulla.org"   },   {     "id": "39",     "name": "Julian Neal",     "email": "Nunc@diamvel.net"   },   {     "id": "40",     "name": "Hiram Newton",     "email": "primis.in@sedorcilobortis.com"   },   {     "id": "41",     "name": "August Banks",     "email": "odio.Etiam@urna.org"   },   {     "id": "42",     "name": "Basil Garrison",     "email": "elit@enimsit.edu"   },   {     "id": "43",     "name": "Buckminster Nelson",     "email": "quis.turpis.vitae@adipiscing.com"   },   {     "id": "44",     "name": "Lane Benjamin",     "email": "aliquam@semper.net"   },   {     "id": "45",     "name": "Burke Gordon",     "email": "ac@vulputateduinec.net"   },   {     "id": "46",     "name": "Logan Harris",     "email": "gravida@Curabituregestas.edu"   },   {     "id": "47",     "name": "Barry Hansen",     "email": "Donec.dignissim@ornarelectus.org"   },   {     "id": "48",     "name": "Jared Mckenzie",     "email": "ante.dictum@duiFusce.edu"   },   {     "id": "49",     "name": "Timon Bruce",     "email": "neque.pellentesque@quistristiqueac.edu"   },   {     "id": "50",     "name": "Jordan Gross",     "email": "Proin.vel.arcu@felispurus.net"   },   {     "id": "51",     "name": "Rudyard Sparks",     "email": "montes@maurisid.com"   },   {     "id": "52",     "name": "Abraham Wong",     "email": "orci.Phasellus.dapibus@Proin.org"   },   {     "id": "53",     "name": "Barrett Glenn",     "email": "suscipit@nunc.ca"   },   {     "id": "54",     "name": "Ciaran Snyder",     "email": "ipsum@turpisAliquam.edu"   },   {     "id": "55",     "name": "Carl Golden",     "email": "Aliquam@atsem.co.uk"   },   {     "id": "56",     "name": "Leroy Pollard",     "email": "Etiam@loremipsumsodales.com"   },   {     "id": "57",     "name": "Garth Burch",     "email": "est.congue@Namconsequat.com"   },   {     "id": "58",     "name": "Lane Huff",     "email": "malesuada.vel.venenatis@dolorDonec.co.uk"   },   {     "id": "59",     "name": "Gray Kirkland",     "email": "et.eros.Proin@nonantebibendum.com"   },   {     "id": "60",     "name": "Bert Forbes",     "email": "adipiscing@gravida.com"   },   {     "id": "61",     "name": "Elvis Jenkins",     "email": "arcu.Vivamus@aliquetvel.ca"   },   {     "id": "62",     "name": "Mark Knox",     "email": "leo.Vivamus.nibh@arcuVestibulumut.net"   },   {     "id": "63",     "name": "Lance Colon",     "email": "congue@ipsumporta.org"   },   {     "id": "64",     "name": "Vladimir Hansen",     "email": "et.commodo@torquentperconubia.co.uk"   },   {     "id": "65",     "name": "Wade Barton",     "email": "nibh@DuisgravidaPraesent.co.uk"   },   {     "id": "66",     "name": "Dante Molina",     "email": "consectetuer.adipiscing@ipsumdolorsit.co.uk"   },   {     "id": "67",     "name": "Charles Hudson",     "email": "tempor@turpisnonenim.edu"   },   {     "id": "68",     "name": "Elton Kane",     "email": "Sed@luctusutpellentesque.co.uk"   },   {     "id": "69",     "name": "Abel Frank",     "email": "posuere.vulputate.lacus@etmagnis.com"   },   {     "id": "70",     "name": "Garrett Aguilar",     "email": "aliquet.odio.Etiam@nibhdolornonummy.ca"   },   {     "id": "71",     "name": "Lester Hendricks",     "email": "mauris@ategestas.edu"   },   {     "id": "72",     "name": "Elmo Franks",     "email": "Sed.eu.nibh@venenatislacusEtiam.com"   },   {     "id": "73",     "name": "Randall Anderson",     "email": "Mauris.vestibulum@sapien.ca"   },   {     "id": "74",     "name": "Jackson Buckley",     "email": "dui.Cum.sociis@nonleoVivamus.edu"   },   {     "id": "75",     "name": "George Mercado",     "email": "non.lacinia@sitamet.com"   },   {     "id": "76",     "name": "Prescott Bradley",     "email": "a.odio@inconsectetuer.edu"   },   {     "id": "77",     "name": "Wallace Downs",     "email": "odio.auctor@ornare.edu"   },   {     "id": "78",     "name": "Vladimir Mcintosh",     "email": "eget.massa@enimgravida.org"   },   {     "id": "79",     "name": "Dennis Hull",     "email": "Mauris.non.dui@leo.ca"   },   {     "id": "80",     "name": "Keefe Short",     "email": "fermentum.vel.mauris@Phasellusvitaemauris.org"   },   {     "id": "81",     "name": "Xanthus Hampton",     "email": "Sed@Etiam.com"   },   {     "id": "82",     "name": "Gregory Bishop",     "email": "magnis@Sedeget.com"   },   {     "id": "83",     "name": "Basil Acosta",     "email": "enim.diam.vel@purusactellus.net"   },   {     "id": "84",     "name": "Griffith Weiss",     "email": "ante@rhoncusNullam.com"   },   {     "id": "85",     "name": "Nash Mcdowell",     "email": "commodo@ante.ca"   },   {     "id": "86",     "name": "Phelan Gilbert",     "email": "natoque.penatibus.et@fames.com"   },   {     "id": "87",     "name": "Devin Gregory",     "email": "sed.hendrerit@bibendumDonecfelis.edu"   },   {     "id": "88",     "name": "Jelani Marquez",     "email": "leo@mollis.ca"   },   {     "id": "89",     "name": "Kadeem Harper",     "email": "sapien@enimEtiamimperdiet.net"   },   {     "id": "90",     "name": "Shad Tyson",     "email": "mauris@duiCum.net"   },   {     "id": "91",     "name": "Nigel Cole",     "email": "aliquet.odio.Etiam@dictumeu.net"   },   {     "id": "92",     "name": "Jerry Short",     "email": "Nam@sitametconsectetuer.ca"   },   {     "id": "93",     "name": "Josiah Chase",     "email": "Aenean.massa.Integer@in.net"   },   {     "id": "94",     "name": "Chaim Alvarado",     "email": "ultricies@varius.net"   },   {     "id": "95",     "name": "Victor Manning",     "email": "est.Mauris@blandit.ca"   },   {     "id": "96",     "name": "Caldwell Marks",     "email": "a.nunc@amet.com"   },   {     "id": "97",     "name": "Burke Colon",     "email": "lacus.vestibulum.lorem@euelit.co.uk"   },   {     "id": "98",     "name": "Keane Molina",     "email": "adipiscing.Mauris@dolornonummy.org"   },   {     "id": "99",     "name": "Theodore Hutchinson",     "email": "id@dignissimmagna.edu"   },   {     "id": "100",     "name": "Griffin Gates",     "email": "imperdiet.nec@Donec.net"   },   {     "id": "107",     "name": "Haerul Muttaqin",     "email": "haerul@mail.com"   } ]  
Jadi, kalo udah hingga sini Server kalian udah siap deh..
kini kita lanjut ke tahap pembuatan aplikasi android nya.

Pembuatan Aplikasi


4. Persiapan Project di Android Studio
  • Buat project gres (beri nama terserah anda saja) kemudian,
  • Tambahkan dependencies menyerupai berikut pada build.gradle proyek kalian :
                                                                                               //build.gradle(Module:app)      implementation 'com.squareup.retrofit2:retrofit:2.4.0'     implementation 'com.squareup.retrofit2:converter-gson:2.2.0'     implementation 'com.android.support:recyclerview-v7:26.1.0'  


5. Pembuatan Project
  • Buka file res/layout/activtiy_main.xml,
    Ubah menyerupai instruksi dibawah ini
  • Tambahkan dependencies menyerupai berikut pada build.gradle proyek kalian :
                                                        <?xml version="1.0" encoding="utf-8"?> <RelativeLayout     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">      <ProgressBar         android:id="@+id/prograss"         android:layout_centerInParent="true"         android:layout_width="wrap_content"         android:layout_height="wrap_content" />      <android.support.v7.widget.RecyclerView         android:id="@+id/recyclerView"         android:layout_width="match_parent"         android:layout_height="match_parent" />  </RelativeLayout>  
instruksi di atas yaitu untuk menapilkan baris contact di RecyclerView

  • Kemudian buat file xml gres dan beri nama item.xml
                                                        <?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:orientation="vertical"     android:layout_height="wrap_content">      <TextView         android:paddingTop="10dp"         android:paddingLeft="15dp"         android:paddingRight="15dp"         android:textSize="20sp"         android:textColor="#111"         android:id="@+id/name"         android:text="Name"         android:layout_width="match_parent"         android:layout_height="wrap_content" />      <TextView         android:paddingTop="5dp"         android:paddingBottom="10dp"         android:paddingLeft="15dp"         android:paddingRight="15dp"         android:id="@+id/email"         android:text="Email"         android:layout_width="match_parent"         android:layout_height="wrap_content" />      <View         android:background="#bfbfbf"         android:layout_width="match_parent"         android:layout_height="0.1dp"/>  </LinearLayout>  
Kode di atas akan di-populasikan oleh adapter.
jadi, nantinya instruksi ini akan dibentuk berulang sesuai data yang ada, yang akan ditampilkan dilayar.
Kemudian,
  • Buat file Java gres dan beri nama Adapter.java
berikut instruksi untuk Adapter.java
                                                        import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;  import java.util.List;  /**  * Created by haerul on 17/03/18.  */  public class Adapter extends RecyclerView.Adapter {      private List contacts;     private Context context;      public Adapter(List contacts, Context context) {         this.contacts = contacts;         this.context = context;     }      @Override     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);         return new MyViewHolder(view);     }      @Override     public void onBindViewHolder(MyViewHolder holder, int position) {         holder.name.setText(contacts.get(position).getName());         holder.email.setText(contacts.get(position).getEmail());     }      @Override     public int getItemCount() {         return contacts.size();     }      public static class MyViewHolder extends RecyclerView.ViewHolder{         TextView name,email;         public MyViewHolder(View itemView) {             super(itemView);             name = itemView.findViewById(R.id.name);             email = itemView.findViewById(R.id.email);         }     } }   
Kemudian,
buatkan model untuk menampung data dari penyedia. maksudnya nanti data yang kita Request memakai retrofit akan di-set kedalam model, kemudian di presentasikan oleh adapter yang sudah dibentuk diatas.
  • Buat file java baru, beri nama model tersebut dengan nama Contact.java
Berikut instruksi untuk modelnya Contact.java
                                                        import com.google.gson.annotations.SerializedName;  /**  * Created by haerul on 17/03/18.  */  public class Contact {      @SerializedName("id") private int Id;     @SerializedName("name") private String Name;     @SerializedName("email") private String Email;      public int getId() {         return Id;     }      public String getName() {         return Name;     }      public String getEmail() {         return Email;     } } 
@SerializedName ialah untuk menganotasikan nama dari penyedia.
dan parameter yang diisikan harus sama dengan JSONArray yang dibuat

Kemudian,

  • Buat file java baru, beri nama ApiClient.java
                                                            import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory;  /**  * Created by haerul on 17/03/18.  */  public class ApiClient {      public static final String BASE_URL = "http://ipaddress/retrofit/";     public static Retrofit retrofit;      public static Retrofit getApiClient(){         if (retrofit==null){             retrofit = new Retrofit.Builder()                     .baseUrl(BASE_URL)                     .addConverterFactory(GsonConverterFactory.create())                     .build();         }         return retrofit;     } } 
    Kode diatas terdapat BASE_URL dan diisikan dengan url induk dari api kalian. /retrofit/ ialah folder yang taid dibentuk dan didalam nya terdapat file php yang dibuat, dan jangan lupan anda mengganti ipaddress dengan IP Address laptop kalian.

    Kemudian,

  • Buat file java baru, beri nama ApiInterface.java
  • Jangan lupa untuk mengganti Kind : menjadi Interface
    Berikut ini instruksi untuk ApiInterface
                                                            import java.util.List;  import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Query;  /**  * Created by haerul on 17/03/18.  */  public interface ApiInterface {      @GET("getcontacts.php")     Call < List< Contact>> getContact(             @Query("item_type") String item_type                  ); } 
    • Karena kita akan menciptakan undangan dengan metode GET jadi, yang akan kita gunakan yaitu @GET() dan parameternya diisi dengan nama file php yang kita buat lengkap dengan extentionnya (.php).
    • @Query("item_type") String item_type ialah data yang dimasukan kedalam metode GET tersebut, yang nantinya akan ditangkap oleh file php dengan nama item_type
    • Kemudian, getContact(.. itu sendiri akan memanggil kembali data yang dikirimkan.

Dan yang terakhir instruksi untuk MainActivity.java
  • Buka file MainActvitiy kemudia ubah instruksi nya menjadi menyerupai ini :
                                                        import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ProgressBar; import android.widget.Toast;  import java.util.List;  import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response;  public class MainActivity extends AppCompatActivity {      private RecyclerView recyclerView;     private RecyclerView.LayoutManager layoutManager;     private List contacts;     private Adapter adapter;     private ApiInterface apiInterface;     ProgressBar progressBar;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          progressBar = findViewById(R.id.prograss);         recyclerView = findViewById(R.id.recyclerView);         layoutManager = new LinearLayoutManager(this);         recyclerView.setLayoutManager(layoutManager);         recyclerView.setHasFixedSize(true);         fetchContact("users");      }      public void fetchContact(String type){          apiInterface = ApiClient.getApiClient().create(ApiInterface.class);          Call< List< Contact>> call = apiInterface.getContact(type);         call.enqueue(new Callback>() {             @Override             public void onResponse(Call> call, Response> response) {                 progressBar.setVisibility(View.GONE);                 contacts = response.body();                 adapter = new Adapter(contacts, MainActivity.this);                 recyclerView.setAdapter(adapter);                 adapter.notifyDataSetChanged();             }              @Override             public void onFailure(Call> call, Throwable t) {                 progressBar.setVisibility(View.GONE);                 Toast.makeText(MainActivity.this, "Error\n"+t.toString(), Toast.LENGTH_LONG).show();             }         });     }  } 

Selesai ! :)

Hasil nya akan menyerupai ini :



Download Source Code

Salam Subuh!