{"id":1632,"date":"2021-11-15T19:31:27","date_gmt":"2021-11-15T19:31:27","guid":{"rendered":"http:\/\/144.76.171.171\/blog\/?p=1632"},"modified":"2021-11-19T20:12:03","modified_gmt":"2021-11-19T20:12:03","slug":"recyclerview-kullanimi","status":"publish","type":"post","link":"https:\/\/berenkudaygorun.com\/blog\/blog\/2021\/11\/15\/recyclerview-kullanimi\/","title":{"rendered":"RecyclerView Kullan\u0131m\u0131 &#8211; Android Eski Notlar #6"},"content":{"rendered":"<p>Bu yaz\u0131 i\u00e7erisinde kod \u00f6rnekleriyle RecyclerView kullan\u0131m\u0131n\u0131 g\u00f6rece\u011fiz.<br \/>\nProjemizi olu\u015ftural\u0131m. <code>ListItem.java<\/code> (bizim modelimiz olacak) ve <code>MyAdapter.java<\/code> (adapterimiz olacak) iki adet class olu\u015ftural\u0131m.<\/p>\n<p>Daha sonras\u0131nda RecyclerView i\u00e7erisinde g\u00f6sterece\u011fimiz bir layout olu\u015fturaca\u011f\u0131z. Burada card itemini kullanca\u011f\u0131z. Bunada <code>list_item.xml<\/code> diyece\u011fiz. \u0130lk olarak tasar\u0131m kodlar\u0131yla ba\u015flayal\u0131m.<\/p>\n<p>activity_main.xml<\/p>\n<pre><code class=\"language-XML\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    tools:context=&quot;.MainActivity&quot;&gt;\n\n    &lt;androidx.recyclerview.widget.RecyclerView\n        android:id=&quot;@+id\/recyclerView&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot;\n        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;\n        app:layout_constraintEnd_toEndOf=&quot;parent&quot;\n        app:layout_constraintStart_toStartOf=&quot;parent&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n<p>list_item.xml<\/p>\n<pre><code class=\"language-XML\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    tools:context=&quot;.MainActivity&quot;&gt;\n\n    &lt;androidx.recyclerview.widget.RecyclerView\n        android:id=&quot;@+id\/recyclerView&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot;\n        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;\n        app:layout_constraintEnd_toEndOf=&quot;parent&quot;\n        app:layout_constraintStart_toStartOf=&quot;parent&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n<p>\u0130lk olarak modelimizle ba\u015flayal\u0131m.<\/p>\n<p>ListItem.java<\/p>\n<pre><code>package com.example.recyclerviewproject;\n\npublic class ListItem {\n\n    private String Head;\n    private String Desc;\n\n    public ListItem(String head, String desc) {\n        Head = head;\n        Desc = desc;\n    }\n\n    public String getHead() {\n        return Head;\n    }\n\n    public void setHead(String head) {\n        Head = head;\n    }\n\n    public String getDesc() {\n        return Desc;\n    }\n\n    public void setDesc(String desc) {\n        Desc = desc;\n    }\n}\n<\/code><\/pre>\n<p>\u015eimdi ise Adapter&#8217;imizi yazal\u0131m. Kodlar\u0131n ne anlama geldi\u011fini a\u015fama a\u015fama a\u00e7\u0131klayaca\u011f\u0131m.<br \/>\nMyAdapter.java<\/p>\n<pre><code class=\"language-java\">package com.example.recyclerviewproject;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport java.util.List;\n\npublic class MyAdapter extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder&gt; {\n\n    private List&lt;ListItem&gt; listItemList;\n    private Context context;\n\n    public MyAdapter(List&lt;ListItem&gt; listItemList, Context context) {\n        this.listItemList = listItemList;\n        this.context = context;\n    }\n\n    @NonNull\n    @Override\n    public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);\n        return  new ViewHolder(v);\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {\n        ListItem listItem = listItemList.get(position);\n\n        holder.textViewHead.setText(listItem.getHead());\n        holder.textViewDesc.setText(listItem.getDesc());\n\n    }\n\n    @Override\n    public int getItemCount() {\n        return listItemList.size();\n    }\n\n    public class ViewHolder extends RecyclerView.ViewHolder{\n\n        public TextView textViewHead, textViewDesc;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            textViewHead = itemView.findViewById(R.id.textiewHead);\n            textViewDesc = itemView.findViewById(R.id.textViewDescription);\n        }\n    }\n}\n<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere 2 adet class&#8217;\u0131m\u0131z mevcut. Class&#8217;\u0131n bo\u015f oldu\u011funu d\u00fc\u015f\u00fcnerek ilk ba\u015fta a\u015fa\u011f\u0131daki kodlar\u0131 yaz\u0131yoruz.<\/p>\n<pre><code class=\"language-java\">public class MyAdapter {\n\n    public class ViewHolder extends RecyclerView.ViewHolder{\n\n        public TextView textViewHead, textViewDesc;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            textViewHead = itemView.findViewById(R.id.textiewHead);\n            textViewDesc = itemView.findViewById(R.id.textViewDescription);\n        }\n    }\n}<\/code><\/pre>\n<p>class i\u00e7erisinde bir class daha olu\u015fturarak ad\u0131na <code>ViewHolder<\/code> dedim. Bu class sayesinde asl\u0131nda card&#8217;\u0131m\u0131z i\u00e7erisindeki itemlere ula\u015f\u0131yoruz. Asl\u0131nda adapterimizin i\u00e7erisinde bu class \u00e7a\u011f\u0131r\u0131lacak. \u015eimdi as\u0131l class&#8217;\u0131m\u0131z\u0131 yazal\u0131m.<\/p>\n<pre><code class=\"language-java\">package com.example.recyclerviewproject;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport java.util.List;\n\npublic class MyAdapter extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder&gt; {\n\n    public class ViewHolder extends RecyclerView.ViewHolder{\n\n        public TextView textViewHead, textViewDesc;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            textViewHead = itemView.findViewById(R.id.textiewHead);\n            textViewDesc = itemView.findViewById(R.id.textViewDescription);\n        }\n    }\n}\n<\/code><\/pre>\n<p>Bu a\u015famada program hata verecektir. \u00c7\u00fcnk\u00fc miras ald\u0131\u011f\u0131m\u0131z RecyclerView.Adapter class bir abstract classt\u0131r ve generic olarak bir viewholder nesnesi almaktad\u0131r. Az \u00f6nce biz bu class&#8217;\u0131 tan\u0131mlam\u0131\u015ft\u0131k. ViewHolder isminde ve <code>RecyclerView.ViewHolder<\/code> abstract class&#8217;\u0131ndan miras ald\u0131\u011f\u0131n\u0131 s\u00f6ylemi\u015ftik. \u015eimdi gerekli implementasyonlar\u0131 yapal\u0131m. Son hali a\u015fa\u011f\u0131daki gibi olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">package com.example.recyclerviewproject;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport java.util.List;\n\npublic class MyAdapter extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder&gt; {\n\n    @NonNull\n    @Override\n    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        return null;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {\n\n    }\n\n    @Override\n    public int getItemCount() {\n        return 0;\n    }\n\n    public class ViewHolder extends RecyclerView.ViewHolder{\n\n        public TextView textViewHead, textViewDesc;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            textViewHead = itemView.findViewById(R.id.textiewHead);\n            textViewDesc = itemView.findViewById(R.id.textViewDescription);\n        }\n    }\n}\n<\/code><\/pre>\n<p>\u0130mplemen etti\u011fimiz metotlar\u0131n ne anlama geldiklerini \u00e7al\u0131\u015fma s\u0131ras\u0131na g\u00f6re anlatal\u0131m.<\/p>\n<p>\u0130lk olarak <code>getItemCount()<\/code> metodu \u00e7al\u0131\u015ft\u0131r\u0131lacakt\u0131r. Buradan olu\u015fturmu\u015f oldu\u011fumuz model i\u00e7erisindeki elemanlar\u0131 kullanrak olu\u015fturdu\u011fumuz dizinin uzunlu\u011fu al\u0131nacakt\u0131r. Biz \u015fimdilik dumy data kullanca\u011f\u0131z oy\u00fczden bunu bir web sunucusundan ald\u0131\u011f\u0131m\u0131z\u0131 varsayarak devam etmenizi istiyorum. Metot <code>return listItemList.size();<\/code> \u015feklinde bir de\u011fer d\u00f6nd\u00fcrebilir. Burada bizim bir List eleman\u0131na ve daha sonras\u0131nda onun size&#8217;\u0131na ihtiyac\u0131m\u0131z var. Demek oluyorki bu class a\u00e7\u011f\u0131r\u0131ld\u0131\u011f\u0131nda buna bir List g\u00f6ndermeliyiz. Daha  sonras\u0131nda bu List&#8217;i kullanaca\u011f\u0131z. O halde bir constructer tan\u0131mlayal\u0131m ve gerekli elemanlar\u0131m\u0131z\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre><code>    private List&lt;ListItem&gt; listItemList;\n    private Context context;\n\n    public MyAdapter(List&lt;ListItem&gt; listItemList, Context context) {\n        this.listItemList = listItemList;\n        this.context = context;\n    }<\/code><\/pre>\n<p>Harika art\u0131k metodumuzuda tamamlayabiliriz. Son hali a\u015fa\u011f\u0131daki gibi olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">   @Override\n    public int getItemCount() {\n        return listItemList.size();\n    }<\/code><\/pre>\n<p>Amac\u0131m\u0131z asl\u0131nda ViewHolder class&#8217;\u0131 i\u00e7erisinde elde etti\u011fimiz itemleri manip\u00fcle etmek bunun i\u00e7in asl\u0131nda ka\u00e7kere bu class&#8217;\u0131n \u00e7a\u011f\u0131r\u0131laca\u011f\u0131n\u0131 belirlememiz gerekmektedir. Bundan dolay\u0131 yukar\u0131daki metoda ihtiyac\u0131m\u0131z vard\u0131. \u015eimdi art\u0131k ViewHolder class&#8217;\u0131n\u0131 \u00e7a\u011f\u0131rabiliriz. Bunun i\u00e7in g\u00f6revli olan metodumuz ise <code> onCreateViewHolder(@NonNull ViewGroup parent, int viewType)<\/code> metodudur. Kodlar\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<pre><code class=\"language-java\">    @NonNull\n    @Override\n    public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);\n        return  new ViewHolder(v);\n    }<\/code><\/pre>\n<p>LayoutInflater sayesinde XML verilerini bir View objesine d\u00f6n\u00fc\u015ft\u00fcyoruz daha sonras\u0131nda bir ViewHolder nesnesi olarak geri g\u00f6nderiyoruz.<\/p>\n<p>Art\u0131k verilerimizi manip\u00fcle etme zaman\u0131 bunun i\u00e7inde <code>onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position)<\/code> metodu i\u015fletilecektir. Parametrelere bakarak asl\u0131nda neler yapaca\u011f\u0131m\u0131z\u0131 anlayabilirsiniz. Kodlar\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<pre><code class=\"language-java\">    @Override\n    public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {\n        ListItem listItem = listItemList.get(position);\n\n        holder.textViewHead.setText(listItem.getHead());\n        holder.textViewDesc.setText(listItem.getDesc());\n\n    }<\/code><\/pre>\n<p>Tebrikler. Adapter&#8217;in\u00fcz\u00fc yad\u0131n\u0131z. \u015eimdi bunu setleyelim. Bunun i\u00e7in <code>MainActivity.java<\/code> class&#8217;\u0131n\u0131n i\u00e7ine a\u015fa\u011f\u0131daki kodlar\u0131 yazmal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-java\">package com.example.recyclerviewproject;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport android.os.Bundle;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private RecyclerView recyclerView;\n    private RecyclerView.Adapter adapter;\n    private List&lt;ListItem&gt; listItem;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        recyclerView = findViewById(R.id.recyclerView);\n        recyclerView.setHasFixedSize(true);\n        recyclerView.setLayoutManager(new LinearLayoutManager(this));\n\n        listItem = new ArrayList&lt;&gt;();\n        for (int i =0; i&lt; 10; i++)\n        {\n            ListItem listItem1 = new ListItem(&quot;heading&quot;, &quot;Lorem \u0130psum&quot;);\n\n            listItem.add(listItem1);\n        }\n\n        adapter = new MyAdapter(listItem, this);\n        recyclerView.setAdapter(adapter);\n\n    }\n}<\/code><\/pre>\n<p>Neler yapt\u0131k bir bakal\u0131m. A\u015fa\u011f\u0131daki k\u0131s\u0131mlar zaten klasik, bunlar\u0131 ge\u00e7iyorum.<\/p>\n<pre><code class=\"language-java\">    private RecyclerView recyclerView;\n    private RecyclerView.Adapter adapter;\n    private List&lt;ListItem&gt; listItem;<\/code><\/pre>\n<p>Daha sonras\u0131nda recyclerView i\u00e7in gerekli ayarlamalar\u0131 yapm\u0131\u015f\u0131z. <code>setHasFixedSize<\/code> i\u00e7in l\u00fctfen <a href=\"https:\/\/stackoverflow.com\/questions\/28827597\/when-do-we-use-the-recyclerview-sethasfixedsize\/28828749\" title=\"buraya\">buraya<\/a> t\u0131klay\u0131n\u0131z. Daha sonras\u0131nda bir dumy data olu\u015fturmu\u015fuz. Ve bu datay\u0131 List&#8217;imize eklemi\u015fiz.<\/p>\n<pre><code class=\"language-java\">        listItem = new ArrayList&lt;&gt;();\n        for (int i =0; i&lt; 10; i++)\n        {\n            ListItem listItem1 = new ListItem(&quot;heading&quot;, &quot;Lorem \u0130psum&quot;);\n\n            listItem.add(listItem1);\n        }<\/code><\/pre>\n<p>Son olarak adapter kullanaca\u011f\u0131m\u0131z\u0131 biliyoruz. Adapter&#8217;imizi setlemi\u015fsiz.<\/p>\n<pre><code class=\"language-java\">        adapter = new MyAdapter(listItem, this);\n        recyclerView.setAdapter(adapter);<\/code><\/pre>\n<p>Not: E\u011fer projenizde eski teknolojiler kullan\u0131l\u0131yorsa <a href=\"https:\/\/medium.com\/@eminuluyol\/listview-i%C3%A7in-custom-adapter-yaz%C4%B1m%C4%B1-ve-kullan%C4%B1m%C4%B1-a3727684a7eb\" title=\"\u015fu yaz\u0131y\u0131\">\u015fu yaz\u0131y\u0131<\/a> da okumun\u0131z\u0131 tavsiye ederim. E\u011fer konuyu anlad\u0131ysan\u0131z h\u0131zl\u0131 bir \u015fekilde kodlar\u0131 \u00e7\u00f6z\u00fcmleyeceksinizdir.<\/p>\n<h2>Kaynak<\/h2>\n<p><a href=\"https:\/\/www.youtube.com\/playlist?list=PLk7v1Z2rk4hjHrGKo9GqOtLs1e2bglHHA\">https:\/\/www.youtube.com\/playlist?list=PLk7v1Z2rk4hjHrGKo9GqOtLs1e2bglHHA<\/a><br \/>\n<a href=\"https:\/\/github.com\/android\/views-widgets-samples\/tree\/main\/RecyclerView\/\">https:\/\/github.com\/android\/views-widgets-samples\/tree\/main\/RecyclerView\/<\/a><br \/>\n<a href=\"https:\/\/developer.android.com\/guide\/topics\/ui\/layout\/recyclerview#java\">https:\/\/developer.android.com\/guide\/topics\/ui\/layout\/recyclerview#java<\/a><br \/>\n<a href=\"https:\/\/www.youtube.com\/watch?list=PLSg_-k7KzeO8AK_65ApwpbmGuz7dRXhCv&amp;time_continue=1&amp;v=Enx10wRFXTA&amp;feature=emb_title\">https:\/\/www.youtube.com\/watch?list=PLSg_-k7KzeO8AK_65ApwpbmGuz7dRXhCv&#038;time_continue=1&#038;v=Enx10wRFXTA&#038;feature=emb_title<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131 i\u00e7erisinde kod \u00f6rnekleriyle RecyclerView kullan\u0131m\u0131n\u0131 g\u00f6rece\u011fiz. Projemizi olu\u015ftural\u0131m. ListItem.java (bizim modelimiz olacak) ve MyAdapter.java (adapterimiz olacak) iki adet class olu\u015ftural\u0131m. Daha sonras\u0131nda RecyclerView&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/berenkudaygorun.com\/blog\/blog\/2021\/11\/15\/recyclerview-kullanimi\/\">Devam\u0131n\u0131 oku<span class=\"screen-reader-text\">RecyclerView Kullan\u0131m\u0131 &#8211; Android Eski Notlar #6<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[363],"tags":[630,631],"class_list":["post-1632","post","type-post","status-publish","format-standard","hentry","category-android","tag-adapter","tag-recyclerview","entry"],"_links":{"self":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/comments?post=1632"}],"version-history":[{"count":7,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1632\/revisions"}],"predecessor-version":[{"id":1655,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1632\/revisions\/1655"}],"wp:attachment":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/media?parent=1632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/categories?post=1632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/tags?post=1632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}