Bu yazı içerisinde kod örnekleriyle RecyclerView kullanımını göreceğiz.
Projemizi oluşturalım. ListItem.java (bizim modelimiz olacak) ve MyAdapter.java (adapterimiz olacak) iki adet class oluşturalım.
Daha sonrasında RecyclerView içerisinde göstereceğimiz bir layout oluşturacağız. Burada card itemini kullancağız. Bunada list_item.xml diyeceğiz. İlk olarak tasarım kodlarıyla başlayalım.
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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
list_item.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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
İlk olarak modelimizle başlayalım.
ListItem.java
package com.example.recyclerviewproject;
public class ListItem {
private String Head;
private String Desc;
public ListItem(String head, String desc) {
Head = head;
Desc = desc;
}
public String getHead() {
return Head;
}
public void setHead(String head) {
Head = head;
}
public String getDesc() {
return Desc;
}
public void setDesc(String desc) {
Desc = desc;
}
}
Şimdi ise Adapter'imizi yazalım. Kodların ne anlama geldiğini aşama aşama açıklayacağım.
MyAdapter.java
package com.example.recyclerviewproject;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<ListItem> listItemList;
private Context context;
public MyAdapter(List<ListItem> listItemList, Context context) {
this.listItemList = listItemList;
this.context = context;
}
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {
ListItem listItem = listItemList.get(position);
holder.textViewHead.setText(listItem.getHead());
holder.textViewDesc.setText(listItem.getDesc());
}
@Override
public int getItemCount() {
return listItemList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView textViewHead, textViewDesc;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textViewHead = itemView.findViewById(R.id.textiewHead);
textViewDesc = itemView.findViewById(R.id.textViewDescription);
}
}
}
Görüldüğü üzere 2 adet class'ımız mevcut. Class'ın boş olduğunu düşünerek ilk başta aşağıdaki kodları yazıyoruz.
public class MyAdapter {
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView textViewHead, textViewDesc;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textViewHead = itemView.findViewById(R.id.textiewHead);
textViewDesc = itemView.findViewById(R.id.textViewDescription);
}
}
}
class içerisinde bir class daha oluşturarak adına ViewHolder dedim. Bu class sayesinde aslında card'ımız içerisindeki itemlere ulaşıyoruz. Aslında adapterimizin içerisinde bu class çağırılacak. Şimdi asıl class'ımızı yazalım.
package com.example.recyclerviewproject;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView textViewHead, textViewDesc;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textViewHead = itemView.findViewById(R.id.textiewHead);
textViewDesc = itemView.findViewById(R.id.textViewDescription);
}
}
}
Bu aşamada program hata verecektir. Çünkü miras aldığımız RecyclerView.Adapter class bir abstract classtır ve generic olarak bir viewholder nesnesi almaktadır. Az önce biz bu class'ı tanımlamıştık. ViewHolder isminde ve RecyclerView.ViewHolder abstract class'ından miras aldığını söylemiştik. Şimdi gerekli implementasyonları yapalım. Son hali aşağıdaki gibi olmalıdır.
package com.example.recyclerviewproject;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView textViewHead, textViewDesc;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textViewHead = itemView.findViewById(R.id.textiewHead);
textViewDesc = itemView.findViewById(R.id.textViewDescription);
}
}
}
İmplemen ettiğimiz metotların ne anlama geldiklerini çalışma sırasına göre anlatalım.
İlk olarak getItemCount() metodu çalıştırılacaktır. Buradan oluşturmuş olduğumuz model içerisindeki elemanları kullanrak oluşturduğumuz dizinin uzunluğu alınacaktır. Biz şimdilik dumy data kullancağız oyüzden bunu bir web sunucusundan aldığımızı varsayarak devam etmenizi istiyorum. Metot return listItemList.size(); şeklinde bir değer döndürebilir. Burada bizim bir List elemanına ve daha sonrasında onun size'ına ihtiyacımız var. Demek oluyorki bu class açğırıldığında buna bir List göndermeliyiz. Daha sonrasında bu List'i kullanacağız. O halde bir constructer tanımlayalım ve gerekli elemanlarımızı tanımlayalım.
private List<ListItem> listItemList;
private Context context;
public MyAdapter(List<ListItem> listItemList, Context context) {
this.listItemList = listItemList;
this.context = context;
}
Harika artık metodumuzuda tamamlayabiliriz. Son hali aşağıdaki gibi olmalıdır.
@Override
public int getItemCount() {
return listItemList.size();
}
Amacımız aslında ViewHolder class'ı içerisinde elde ettiğimiz itemleri manipüle etmek bunun için aslında kaçkere bu class'ın çağırılacağını belirlememiz gerekmektedir. Bundan dolayı yukarıdaki metoda ihtiyacımız vardı. Şimdi artık ViewHolder class'ını çağırabiliriz. Bunun için görevli olan metodumuz ise onCreateViewHolder(@NonNull ViewGroup parent, int viewType) metodudur. Kodları aşağıdaki gibi olacaktır.
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(v);
}
LayoutInflater sayesinde XML verilerini bir View objesine dönüştüyoruz daha sonrasında bir ViewHolder nesnesi olarak geri gönderiyoruz.
Artık verilerimizi manipüle etme zamanı bunun içinde onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) metodu işletilecektir. Parametrelere bakarak aslında neler yapacağımızı anlayabilirsiniz. Kodları aşağıdaki gibi olacaktır.
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {
ListItem listItem = listItemList.get(position);
holder.textViewHead.setText(listItem.getHead());
holder.textViewDesc.setText(listItem.getDesc());
}
Tebrikler. Adapter'inüzü yadınız. Şimdi bunu setleyelim. Bunun için MainActivity.java class'ının içine aşağıdaki kodları yazmalıyız.
package com.example.recyclerviewproject;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
listItem = new ArrayList<>();
for (int i =0; i< 10; i++)
{
ListItem listItem1 = new ListItem("heading", "Lorem İpsum");
listItem.add(listItem1);
}
adapter = new MyAdapter(listItem, this);
recyclerView.setAdapter(adapter);
}
}
Neler yaptık bir bakalım. Aşağıdaki kısımlar zaten klasik, bunları geçiyorum.
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listItem;
Daha sonrasında recyclerView için gerekli ayarlamaları yapmışız. setHasFixedSize için lütfen buraya tıklayınız. Daha sonrasında bir dumy data oluşturmuşuz. Ve bu datayı List'imize eklemişiz.
listItem = new ArrayList<>();
for (int i =0; i< 10; i++)
{
ListItem listItem1 = new ListItem("heading", "Lorem İpsum");
listItem.add(listItem1);
}
Son olarak adapter kullanacağımızı biliyoruz. Adapter'imizi setlemişsiz.
adapter = new MyAdapter(listItem, this);
recyclerView.setAdapter(adapter);
Not: Eğer projenizde eski teknolojiler kullanılıyorsa şu yazıyı da okumunızı tavsiye ederim. Eğer konuyu anladıysanız hızlı bir şekilde kodları çözümleyeceksinizdir.
Kaynak
https://www.youtube.com/playlist?list=PLk7v1Z2rk4hjHrGKo9GqOtLs1e2bglHHA
https://github.com/android/views-widgets-samples/tree/main/RecyclerView/
https://developer.android.com/guide/topics/ui/layout/recyclerview#java
https://www.youtube.com/watch?list=PLSg_-k7KzeO8AK_65ApwpbmGuz7dRXhCv&time_continue=1&v=Enx10wRFXTA&feature=emb_title
İlk Yorumu Siz Yapın