{"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'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'\u0131m\u0131z mevcut. Class'\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'\u0131m\u0131z i\u00e7erisindeki itemlere ula\u015f\u0131yoruz. Asl\u0131nda adapterimizin i\u00e7erisinde bu class \u00e7a\u011f\u0131r\u0131lacak. \u015eimdi as\u0131l class'\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'\u0131 tan\u0131mlam\u0131\u015ft\u0131k. ViewHolder isminde ve <code>RecyclerView.ViewHolder<\/code> abstract class'\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'\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'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'\u0131 i\u00e7erisinde elde etti\u011fimiz itemleri manip\u00fcle etmek bunun i\u00e7in asl\u0131nda ka\u00e7kere bu class'\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'\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'in\u00fcz\u00fc yad\u0131n\u0131z. \u015eimdi bunu setleyelim. Bunun i\u00e7in <code>MainActivity.java<\/code> class'\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'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'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&time_continue=1&v=Enx10wRFXTA&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}]}}