İçeriğe geç

RecyclerView Kullanımı – Android Eski Notlar #6

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

Kategori:Android

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir