RecyclerView Multiple ViewHolder Kullanımı

RecyclerView Multiple ViewHolder Kullanımı

RecyclerView Multiple ViewHolder Kullanımı

RecyclerView üzerinde birden farklı satır görüntüsü gösterilmesi örneği

RecyclerView Multiple ViewHolder Kullanımı

RecyclerView nesnesi ile yapabileceğiniz çokça örnekten biri de, her satırın birbirinden benzersiz görüntülere sahip olmasıdır. Multiple View Holder mekanizması sayesinde her satır aynı görüntüde olmasın da;

Örneğin: 1. ve 2. satırda Kişi, 3. satırda Reklam layout'u göstersin, 4 ve 5. satırlarda yine Kişi değerini göstermeye devam etsin gibi işler yapmanız gereken durumlar oluşabilir. Hazırsak örneği görelim.

Projenizin Build.Gradle(Module: app) içerisinde depentencies scope'u içerisine aşağıdaki satırları ekleyiniz.

implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'

res > layout > layout_kisi.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="110dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/ivResim"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="15dp"
                android:layout_marginTop="13dp"
                app:srcCompat="@mipmap/ic_launcher_round" />

            <TextView
                android:id="@+id/tvAdSoyad"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="148dp"
                android:layout_marginTop="22dp"
                android:text="TextView"
                android:textSize="24sp" />

            <TextView
                android:id="@+id/tvYas"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignStart="@+id/tvAdSoyad"
                android:layout_alignParentTop="true"
                android:layout_marginTop="66dp"
                android:text="TextView" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>

res > layout > layout_reklam.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_margin="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="16dp"
                android:layout_marginTop="37dp"
                android:text="Reklam" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>

res > layout > activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".Activity.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />
</RelativeLayout>

drawable klasörü içerisine > user1.png, user2.png dosyaları ekleyiniz.

Projenizin içerisine Model paketi oluşturup;

Kisi sınıfı üretiniz;

public class Kisi {
    private int resimId;
    private int yas;
    private String adSoyad;

    public Kisi() {
    }

    public Kisi(int resimId, int yas, String adSoyad) {
        this.resimId = resimId;
        this.yas = yas;
        this.adSoyad = adSoyad;
    }

    public int getResimId() {
        return resimId;
    }

    public void setResimId(int resimId) {
        this.resimId = resimId;
    }

    public int getYas() {
        return yas;
    }

    public void setYas(int yas) {
        this.yas = yas;
    }

    public String getAdSoyad() {
        return adSoyad;
    }

    public void setAdSoyad(String adSoyad) {
        this.adSoyad = adSoyad;
    }
}

Reklam sınıfı üretiniz.

public class Reklam {
    private String reklamId;

    public Reklam() {
    }

    public Reklam(String reklamId) {
        this.reklamId = reklamId;
    }

    public String getReklamId() {
        return reklamId;
    }

    public void setReklamId(String reklamId) {
        this.reklamId = reklamId;
    }
}

Adapter paketi üretip, içinde RecyclerViewAdapter sınıfı üretiniz.

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

    private List<Object> list;
    private final static int TIP_KISI = 1, TIP_REKLAM = 2;
    private Context context;

    public RecyclerViewAdapter(List<Object> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getItemViewType(int position) {
        /*
        List içerisindeki gelen tipi yakalayabileceğimiz metot
         */
        if (list.get(position) instanceof Kisi) { // Tipler eşit ise true döner
            return TIP_KISI;
        } else if (list.get(position) instanceof Reklam) {
            return TIP_REKLAM;
        }
        return -1;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        int layout = 0;
        RecyclerView.ViewHolder viewHolder;
        switch (viewType) {
            case TIP_KISI:
                layout = R.layout.layout_kisi;
                View kisiView =
                        LayoutInflater
                                .from(parent.getContext())
                                .inflate(layout,parent,false);
                viewHolder = new KisiViewHolder(kisiView);
                break;
            case TIP_REKLAM:
                layout = R.layout.layout_reklam;
                View reklamView =
                        LayoutInflater
                            .from(parent.getContext())
                            .inflate(layout,parent,false);
                viewHolder = new ReklamViewHolder(reklamView);
                break;
            default:
                viewHolder = null;
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        int viewType = holder.getItemViewType();
        switch (viewType){
            case TIP_KISI:
                Kisi kisi = (Kisi)list.get(position);
                ((KisiViewHolder)holder).showDetails(kisi);
                break;
            case TIP_REKLAM:
                Reklam reklam = (Reklam)list.get(position);
                ((ReklamViewHolder)holder).showDetails(reklam);
                break;
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class KisiViewHolder extends RecyclerView.ViewHolder{
        private TextView tvAdSoyad,tvYas;
        private ImageView ivResim;
        public KisiViewHolder(View itemView) {
            super(itemView);
            ivResim = itemView.findViewById(R.id.ivResim);
            tvAdSoyad = itemView.findViewById(R.id.tvAdSoyad);
            tvYas = itemView.findViewById(R.id.tvYas);
        }
        public void showDetails(Kisi kisi){
            tvAdSoyad.setText(kisi.getAdSoyad());
            tvYas.setText(""+kisi.getYas());
            ivResim.setImageResource(kisi.getResimId());
        }
    }

    public class ReklamViewHolder extends RecyclerView.ViewHolder{
        public ReklamViewHolder(View view){
            super(view);
        }
        public void showDetails(Reklam reklam){

        }
    }
}

Activity paketi içierisinde MainActivity sınıfı için

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerViewAdapter adapter;
    List<Object> objects;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        objects = new ArrayList<>();
        objects.add(new Kisi(R.drawable.user1,20,"Ad Soyad 1"));
        objects.add(new Kisi(R.drawable.user2,20,"Ad Soyad 2"));
        objects.add(new Reklam("12345"));
        objects.add(new Kisi(R.drawable.user1,25,"Ad Soyad 3"));
        objects.add(new Kisi(R.drawable.user2,29,"Ad Soyad 4"));

        adapter = new RecyclerViewAdapter(objects,getApplicationContext());
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recyclerView.setAdapter(adapter);
    }
}

Keyifli çalışmalar diliyorum, yararlı olması dileğimle...


İlgili kelimeler;
android adapter recycler recyclerview multiple viewholder
İlgili kategori;
Android Studio Dersleri
Makaleyi paylaşın; Google+FacebookTwitterTumblrPinterestLinkedIn

Benzer makaleler mi eklemeliyim ? Bana LinkedIn ve Github adreslerimden üzerinden ulaşabilirsiniz.