Hai sobat, kembali lagi bersama saya di artikel tutorial android. Pada artikel sebelumnya yang berjudul Tutorial Android dengan Retrofit HTTP Library, telah dijelaskan tentang cara mendapatkan informasi dari sebuah web dengan menggunakan Retrofit. Selain itu juga terdapat cara menampilkan gambar menggunakan library picasso. Dan pada artikel kali ini, akan ditunjukkan cara menambahkan perintah listener pada RecyclerView.
Pada objek RecyclerView tidak terdapat perintah onItemClickListener seperti yang dimiliki oleh ListView. Untuk menangani perintah klik di RecyclerView, bisa menggunakan interface RecyclerView.OnItemTouchListener(). Untuk perintah klik dapat ditangani dalam onInterceptTouchEvent() dan mengunakan GestureDetector untuk mendeteksi ketukan. Sedangkan untuk mendapatkan posisi item saat diklik, dengan mengunakan method getChildAdapterPosition() dalam objek RecyclerView. dan tampilan item yang diklik bisa diperoleh dari metode findChildViewUnder().
Untuk lebih jelasnya, kita coba membuatnya dalam project Retrofit pada artikel sebelumnya yaitu Tutorial Android dengan Retrofit HTTP Library.
Buka project yang sudah dibuat, lalu buka MainActivity.java dan sisipkan kode berikut di dalam method onResponse
/*perintah klik recyclerview*/
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
GestureDetector gestureDetector = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener() {
public boolean onSingleTapUp(MotionEvent e){
return true;
}
});
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && gestureDetector.onTouchEvent(e)){
int position = rv.getChildAdapterPosition(child);
/*Intent i = new Intent(getApplicationContext(), DetailActivity.class);
i.putExtra("id", movies.get(position).getId());
getApplicationContext().startActivity(i);*/
Toast.makeText(getApplicationContext(), "Id : " + movies.get(position).getId() + " selected", Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
Maka keseluruhan kodenya akan seperti berikut ini
package com.blogsetyaaji.retrofithttplibrary;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.blogsetyaaji.retrofithttplibrary.Adapter.MoviesAdapter;
import com.blogsetyaaji.retrofithttplibrary.Model.Movie;
import com.blogsetyaaji.retrofithttplibrary.Model.MovieResponse;
import com.blogsetyaaji.retrofithttplibrary.Rest.ApiClient;
import com.blogsetyaaji.retrofithttplibrary.Rest.ApiInterface;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
// TODO - insert your themoviedb.org API KEY here
private final static String API_KEY = "e5013e88aad0bad4821bdac93d1d6a30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (API_KEY.isEmpty()) {
Toast.makeText(getApplicationContext(), "Please obtain your API KEY first from themoviedb.org", Toast.LENGTH_LONG).show();
return;
}
final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.movie_recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<MovieResponse> call = apiService.getTopRatedMovies(API_KEY);
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(Call<MovieResponse>call, Response<MovieResponse> response) {
final List<Movie> movies = response.body().getResults();
Log.d(TAG, "Number of movies received: " + movies.size());
Toast.makeText(MainActivity.this, "Number of movies received: " + movies.size(), Toast.LENGTH_LONG).show();
recyclerView.setAdapter(new MoviesAdapter(movies, R.layout.list_item_movie, getApplicationContext()));
/*perintah klik recyclerview*/
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
GestureDetector gestureDetector = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener() {
public boolean onSingleTapUp(MotionEvent e){
return true;
}
});
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && gestureDetector.onTouchEvent(e)){
int position = rv.getChildAdapterPosition(child);
/*Intent i = new Intent(getApplicationContext(), DetailActivity.class);
i.putExtra("id", movies.get(position).getId());
getApplicationContext().startActivity(i);*/
Toast.makeText(getApplicationContext(), "Id : " + movies.get(position).getId() + " selected", Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
}
@Override
public void onFailure(Call<MovieResponse>call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
}
});
}
}
Jalankan program dengan memilih menu Run 'app'. Dan hasilnya adalah jika salah satu item diklik, maka akan muncul toast yang berisi id film.
SIlahkan jika sobat ingin melihat hasil projectnya di github saya