Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
56 views

Modul Retrofit 1. Gradle Yang Dibutuhkan

The document provides instructions on how to set up retrofit for making API calls in an Android application. It includes the required Gradle dependencies, creating a base URL class, setting up a Retrofit service generator, defining request and response models, creating interfaces for the API calls and responses, and setting up a recycler view adapter to display the response data.

Uploaded by

Rosalinda Linda
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
56 views

Modul Retrofit 1. Gradle Yang Dibutuhkan

The document provides instructions on how to set up retrofit for making API calls in an Android application. It includes the required Gradle dependencies, creating a base URL class, setting up a Retrofit service generator, defining request and response models, creating interfaces for the API calls and responses, and setting up a recycler view adapter to display the response data.

Uploaded by

Rosalinda Linda
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 16

Modul Retrofit

1. Gradle Yang dibutuhkan

implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.8.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'

2. Tambahkan Permission

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

3. Buat Sebuah File Java baru dengan nama Server

public class Server {


//ubah sesuai IP masing2 dan folder htdocs
public static String BASE_URL = "http://192.x.xx.xxx/projectta/";

public static final String API_CREATE = "data/add";


public static final String API_READ = "data/read";
public static final String API_UPDATE = "data/edit/";
public static final String API_DELETE = "data/delete/";
public static final String API_UPLOAD = "data/uploadimage/";
}

4. Buat sebuah File Java dengan nama ServiceGenerator

import android.content.Context;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ServiceGenerator {


private static OkHttpClient.Builder builder() {
OkHttpClient.Builder okhttpBuilder = new OkHttpClient().newBuilder();
okhttpBuilder.connectTimeout(60, TimeUnit.SECONDS);
okhttpBuilder.writeTimeout(60, TimeUnit.SECONDS);
okhttpBuilder.readTimeout(60, TimeUnit.SECONDS);

return okhttpBuilder;
}

private static HttpLoggingInterceptor interceptor() {


HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return interceptor;
}
public static <S> S createBaseService(Context context, Class<S> serviceClass) {
OkHttpClient.Builder okhttpBuilder = builder();

// if (BuildConfig.DEBUG) {
// okhttpBuilder.addInterceptor(interceptor());
// }

okhttpBuilder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request newReq = request.newBuilder()
.header("Accept", "application/json")
.build();
return chain.proceed(newReq);
}
});

OkHttpClient client = okhttpBuilder.build();

Retrofit retrofit = new Retrofit.Builder()


.baseUrl(Server.BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();

return retrofit.create(serviceClass);
}
}

5. Buat sebuah kelas untuk menampung response dari server dengan nama BaseResponse

import com.google.gson.annotations.SerializedName;

public class BaseResponse<T> {


@SerializedName("error")
private boolean error;
@SerializedName("message")
private String message;
@SerializedName("data")
private T data;

public boolean isError() {


return error;
}

public void setError(boolean error) {


this.error = error;
}

public String getMessage() {


return message;
}

public void setMessage(String message) {


this.message = message;
}
public T getData() {
return data;
}

public void setData(T data) {


this.data = data;
}
}

6. Selanjutnya buat sebuah file java untuk menampung data atau kita sebut sebuah model dari
data beri nama class tersebut dengan nama Data

package com.binus.retrofittutorial;

import android.os.Parcel;
import android.os.Parcelable;

import com.google.gson.annotations.SerializedName;

public class Data implements Parcelable {


@SerializedName("id_data")
String id;
@SerializedName("name")
String name;

protected Data(Parcel in) {


id = in.readString();
name = in.readString();
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
}

@Override
public int describeContents() {
return 0;
}

public static final Creator<Data> CREATOR = new Creator<Data>() {


@Override
public Data createFromParcel(Parcel in) {
return new Data(in);
}

@Override
public Data[] newArray(int size) {
return new Data[size];
}
};

public String getId() {


return id;
}

public void setId(String id) {


this.id = id;
}

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}
}

7. Buat sebuah interface dengan nama DataService

package com.binus.retrofittutorial;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;

public interface DataService {


@FormUrlEncoded
@POST(Server.API_CREATE)
Call<BaseResponse> apiCreate(@Field("name") String nama);

@GET(Server.API_READ)
Call<BaseResponse<List<Data>>> apiRead();

@FormUrlEncoded
@POST(Server.API_UPDATE)
Call<BaseResponse> apiUpdate(
@Field("id_data") String id,
@Field("name") String name
);

@FormUrlEncoded
@POST(Server.API_DELETE)
Call<BaseResponse> apiDelete(@Field("id_data") String id);
}

8. Buat lagi sebuah interface dengan nama OnUpdateClickListener

package com.binus.retrofittutorial;

public interface OnUpdateClickListener {


void onUpdateClick(int position);
}

9. Buat lagi sebuah interface dengan nama OnDeleteClickListener

package com.binus.retrofittutorial;

public interface OnDeleteClickListener {


void onDeleteClick(int position);
}

10. Karna data akan ditampilkan pada recyclerview ada baiknya kita buat adapter terlebih dahulu,
buat sebuah layout untuk isi RecylerView dengan nama list_data dan buat sebuah class dengan
nama DataAdapter.

Script list_data.xml

<?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="wrap_content"
android:weightSum="4"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal">
<TextView
android:layout_weight="1"
android:id="@+id/tv_nomer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15sp"
android:text="1"/>
<TextView
android:layout_weight="1"
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:textSize="15sp"
android:gravity="center|left"
android:text="RenaldiRey.id"/>

<Button
android:layout_weight="1"
android:id="@+id/btn_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="edit" />

<Button
android:layout_weight="1"
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hapus" />

</LinearLayout>

Script adapter

package com.binus.retrofittutorial;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

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

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {


Context context;
List<Data> data;

OnDeleteClickListener onDeleteClickListener;
OnUpdateClickListener onUpdateClickListener;

public DataAdapter(Context context) {


this.context = context;
data = new ArrayList<>();
}

public void add(Data item) {


data.add(item);
notifyItemInserted(data.size() - 1);
}

public void addAll(List<Data> items) {


for (Data item : items) {
add(item);
}
}

public void setOnDeleteClickListener(OnDeleteClickListener onDeleteClickListener) {


this.onDeleteClickListener = onDeleteClickListener;
}

public void setOnUpdateClickListener(OnUpdateClickListener onUpdateClickListener) {


this.onUpdateClickListener = onUpdateClickListener;
}

public Data getData(int position) {


return data.get(position);
}

public void remove(int position) {


if (position >= 0 && position < data.size()) {
data.remove(position);
notifyItemRemoved(position);
}
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(parent);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

TextView tvNomer;
TextView tvName;
Button btnEdit;
Button btnRemove;

public ViewHolder(ViewGroup parent) {


super(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_data, parent,
false));
initViews();

btnEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onUpdateClickListener.onUpdateClick(getAdapterPosition());
}
});

btnRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onDeleteClickListener.onDeleteClick(getAdapterPosition());
}
});
}

public void bind(Data item) {


int nomer = getAdapterPosition() + 1;
tvNomer.setText(String.valueOf(nomer));
tvName.setText(item.getName());
}

public void initViews() {


tvNomer = (TextView) itemView.findViewById(R.id.tv_nomer);
tvName = (TextView) itemView.findViewById(R.id.tv_name);
btnEdit = (Button) itemView.findViewById(R.id.btn_edit);
btnRemove = (Button) itemView.findViewById(R.id.btn_delete);
}
}
}

11. Langkah selanjutnya adalah melakukan proses integrasi. Kita siapkan terlebih dahulu 4 buah
activity , yaitu :
a. MainActivity -> berfungi untuk menambah data
b. DataActivity -> berfungsi untuk melihat data
c. UpdateActivity -> berfungsi untuk mengubah data

Silahkan teman teman buat dulu activitynya, dan kemudian ubah script layout dan java
menjadi sebagai berikut.
Activity_Main.xml

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Input your name"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/et_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="Submit"/>

<Button
android:id="@+id/btn_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginBottom="10dp"
android:text="view data"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Activity_update.xml

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UpdateActivity">
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Input your name"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/et_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="Submit"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Activity_data.xml

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DataActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_data"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Main_activity.java

package com.binus.retrofittutorial;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static android.text.TextUtils.isEmpty;


public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();


private DataService service;

private EditText etName;


private Button btnSubmit;
private Button btnShow;

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

service = ServiceGenerator.createBaseService(this, DataService.class);


}

private void initListener() {


btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = etName.getText().toString();

if(isEmpty(name))
etName.setError("Must not be empty");
else
addData(name);
}
});

btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataActivity.newInstance(MainActivity.this);
}
});
}

private void addData(String name) {


Call<BaseResponse> call = service.apiCreate(name);

call.enqueue(new Callback<BaseResponse>() {
@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
if(response.code() == 200) {
Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show();
etName.setText("");
}
}

@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
Log.e(TAG + ".error", t.toString());
}
});
}

private void initViews() {


etName = (EditText) findViewById(R.id.et_name);
btnShow = (Button) findViewById(R.id.btn_show);
btnSubmit = (Button) findViewById(R.id.btn_submit);
}
}

DataACtivity.java

package com.binus.retrofittutorial;

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

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class DataActivity extends AppCompatActivity implements OnDeleteClickListener,


OnUpdateClickListener {

private static final String TAG = DataActivity.class.getSimpleName();

private RecyclerView rvData;


private DataAdapter adapter;
private DataService service;

public static void newInstance(Context context) {


Intent intent = new Intent(context, DataActivity.class);
context.startActivity(intent);
}

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

// Initialization adapter
adapter = new DataAdapter(this);
rvData.setLayoutManager(new LinearLayoutManager(this));
service = ServiceGenerator.createBaseService(this, DataService.class);

rvData.setAdapter(adapter);
loadData();
}

private void loadData() {


Call<BaseResponse<List<Data>>> call = service.apiRead();
call.enqueue(new Callback<BaseResponse<List<Data>>>() {
@Override
public void onResponse(Call<BaseResponse<List<Data>>> call,
Response<BaseResponse<List<Data>>> response) {
if(response.code() == 200) {
adapter.addAll(response.body().getData());
initListener();
}
}

@Override
public void onFailure(Call<BaseResponse<List<Data>>> call, Throwable t) {
Log.e(TAG+".error", t.toString());
}
});
}

private void initListener() {


adapter.setOnDeleteClickListener(this);
adapter.setOnUpdateClickListener(this);
}

private void initViews() {


rvData = (RecyclerView) findViewById(R.id.rv_data);
}

private void doDelete(final int position, String id) {


Call<BaseResponse> call = service.apiDelete(id);
call.enqueue(new Callback<BaseResponse>() {
@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
if(response.code() == 200)
adapter.remove(position);
}

@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
Log.e(TAG+".errorDelete", t.toString());
}
});
}

@Override
public void onDeleteClick(final int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Apakah Anda Yakin Ingin Menghapusnya?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
doDelete(position, adapter.getData(position).getId());
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}

@Override
public void onUpdateClick(int position) {
Data data = adapter.getData(position);
UpdateActivity.newInstance(this, data);
}
}

UpdateActivity.java

package com.binus.retrofittutorial;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static android.text.TextUtils.isEmpty;

public class UpdateActivity extends AppCompatActivity {

private static final String TAG = UpdateActivity.class.getSimpleName();

private EditText etName;


private Button btnSubmit;
private DataService service;
private Data data;

public static void newInstance(Context context, Data data) {


Bundle bundle = new Bundle();
bundle.putParcelable(TAG+".data", data);
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtras(bundle);

context.startActivity(intent);
}

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

if(getIntent() != null) {
data = getIntent().getParcelableExtra(TAG+".data");
}

initViews();

service = ServiceGenerator.createBaseService(this, DataService.class);

btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = etName.getText().toString();
Log.e("name", name);

if(isEmpty(name))
etName.setError("Must not be empty");
else
updateData(name);
}
});
}

private void updateData(String name) {


Call<BaseResponse> call = service.apiUpdate(data.getId(), name);

call.enqueue(new Callback<BaseResponse>() {
@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
if(response.code() == 200) {
Toast.makeText(UpdateActivity.this, "Success", Toast.LENGTH_SHORT).show();
etName.setText("");
}
}

@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
Log.e(TAG + ".error", t.toString());
}
});
}

private void initViews() {


etName = (EditText) findViewById(R.id.et_name);
btnSubmit = (Button) findViewById(R.id.btn_submit);

etName.setText(data.getName());
}
}

12. Langkah selanjutnya kita buat table di server dengan nama table tbl_nama
Dengan kolom :
Id_data (AI PK)
Name (Varchar(100))

13. Buat sebuah folder pada folder htdocs dengan nama folder projectta dan buat sebuah folder
data di dalam folder projectta tersebut.
14. Di dalam folder data buat sebuah file php dengan nama koneksi.php
Add.php

Read.php
Edit.php

Delete.php

15. Silahkan di Run.


16. Selamat mencoba

You might also like