RecyclerView ile dinamik listeler oluşturma   Android Jetpack'in bir parçasıdır.

Oluşturma yöntemini deneyin
Android için önerilen kullanıcı arayüzü araç seti Jetpack Compose'dur. Oluşturma bölümünde düzenlerle nasıl çalışacağınızı öğrenin.

RecyclerView, büyük veri kümelerini verimli bir şekilde görüntülemeyi kolaylaştırır. Verileri siz sağlar ve her öğenin nasıl görüneceğini tanımlarsınız. RecyclerView kitaplığı ise öğeleri gerektiğinde dinamik olarak oluşturur.

Adından da anlaşılacağı gibi RecyclerView, bu bağımsız öğeleri geri dönüştürür. Bir öğe ekrandan kaydırıldığında RecyclerView, öğenin görünümünü yok etmez. Bunun yerine, RecyclerView, ekranda kaydırılan yeni öğeler için görünümü yeniden kullanır. RecyclerView, performansı ve uygulamanızın duyarlılığını iyileştirir, güç tüketimini azaltır.

Önemli sınıflar

Dinamik listenizi oluşturmak için çeşitli sınıflar birlikte çalışır.

  • RecyclerView, verilerinize karşılık gelen görüntülemeleri içeren ViewGroup bağımsız değişkenidir. Kendisi bir görünüm olduğundan RecyclerView diğer kullanıcı arayüzü öğelerini eklediğiniz şekilde düzeninize eklersiniz.

  • Listedeki her öğe bir görünüm tutucusu nesnesi tarafından tanımlanır. Görüntü tutucusu oluşturulduğunda, onunla ilişkili herhangi bir veri yoktur. Görünüm tutucusu oluşturulduktan sonra RecyclerView, tutucuyu verilerine bağlar. RecyclerView.ViewHolder öğesini genişleterek görüntü tutucuyu tanımlarsınız.

  • RecyclerView, adaptördeki yöntemleri çağırarak görünümler ister ve görünümleri verilerine bağlar. RecyclerView.Adapter öğesini genişleterek adaptörü tanımlarsınız.

  • Düzen yöneticisi, listenizdeki öğeleri tek tek düzenler. RecyclerView kitaplığı tarafından sağlanan düzen yöneticilerinden birini kullanabilir veya kendi düzen yöneticinizi tanımlayabilirsiniz. Tüm düzen yöneticileri, kitaplığın LayoutManager temsili sınıfını temel alır.

Tüm parçaların nasıl bir araya geldiğini RecyclerView örnek uygulamasında (Kotlin) veya RecyclerView örnek uygulamasında (Java) görebilirsiniz.

RecyclerView'inizi uygulama adımları

RecyclerView'i kullanacaksanız yapmanız gereken birkaç şey vardır. Bunlar aşağıdaki bölümlerde ayrıntılı olarak açıklanmıştır.

  1. Listenin veya tablonun görünümüne karar verin. Normalde, RecyclerView kitaplığının standart düzen yöneticilerinden birini kullanabilirsiniz.

  2. Listedeki her öğenin görünümünü ve davranışını tasarlayın. Bu tasarıma göre ViewHolder sınıfını genişletin. ViewHolder sürümünüz, liste öğeleriniz için tüm işlevleri sunar. Görüntü tutucunuz, bir View'ü saran bir sarmalayıcıdır ve bu görünüm RecyclerView tarafından yönetilir.

  3. Verilerinizi ViewHolder görünümleriyle ilişkilendiren Adapter öğesini tanımlayın.

Ayrıca, RecyclerView'inizi tam olarak ihtiyaçlarınıza göre uyarlamanıza olanak tanıyan gelişmiş özelleştirme seçenekleri de vardır.

Düzeninizi planlama

RecyclerView'inizdeki öğeler bir LayoutManager sınıfına göre düzenlenir. RecyclerView kitaplığı, en yaygın düzen durumlarını ele alan üç düzen yöneticisi sağlar:

  • LinearLayoutManager öğeleri tek boyutlu bir listede düzenler.
  • GridLayoutManager öğeleri iki boyutlu bir ızgara şeklinde düzenler:
    • Izgara dikey olarak düzenlenmişse GridLayoutManager, her satırdaki tüm öğelerin aynı genişlik ve yüksekliğe sahip olmasını dener ancak farklı satırların farklı yükseklikleri olabilir.
    • Izgara yatay olarak düzenlenmişse GridLayoutManager, her sütundaki tüm öğelerin aynı genişlik ve yüksekliğe sahip olmasını dener ancak farklı sütunlar farklı genişliklere sahip olabilir.
  • StaggeredGridLayoutManager, GridLayoutManager'e benzer ancak bir satırdaki öğelerin aynı yüksekliğe (dikey ızgaralar için) veya aynı sütundaki öğelerin aynı genişliğe (yatay ızgaralar için) sahip olmasını gerektirmez. Sonuç olarak, bir satır veya sütundaki öğeler birbirinden kaymış olabilir.

Ayrıca öğelerin düzenini de tasarlamanız gerekir. Bir sonraki bölümde açıklandığı gibi, görüntü tutucuyu tasarlarken bu düzene ihtiyacınız vardır.

Bağdaştırıcınızı ve görüntü tutucunuzu uygulama

Sayfa düzeninizi belirledikten sonra Adapter ve ViewHolder öğelerinizi uygulamanız gerekir. Bu iki sınıf, verilerinizin nasıl gösterileceğini belirlemek için birlikte çalışır. ViewHolder, listedeki bağımsız bir öğenin düzenini içeren bir View sarmalayıcısıdır. Adapter, gerektiğinde ViewHolder nesneleri oluşturur ve bu görünümlerin verilerini de ayarlar. Görüntülemelerin verileriyle ilişkilendirilme işlemine bağlama adı verilir.

Adaptörünüzü tanımlarken üç temel yöntemi geçersiz kılarsınız:

  • onCreateViewHolder(): RecyclerView, yeni bir ViewHolder oluşturması gerektiğinde bu yöntemi çağırır. Yöntem, ViewHolder ve ilişkili View öğesini oluşturup başlatır ancak görünümün içeriğini doldurmaz. ViewHolder henüz belirli verilere bağlanmamıştır.

  • onBindViewHolder(): RecyclerView, bir ViewHolder öğesini veri ile ilişkilendirmek için bu yöntemi çağırır. Bu yöntem, uygun verileri getirir ve görüntü tutucunun düzenini doldurmak için bu verileri kullanır. Örneğin, RecyclerView bir ad listesi gösteriyorsa yöntem listedeki uygun adı bulup görüntü tutucunun TextView widget'ını doldurabilir.

  • getItemCount(): RecyclerView, veri kümesinin boyutunu almak için bu yöntemi çağırır. Örneğin, bir adres defteri uygulamasında bu, toplam adres sayısı olabilir. RecyclerView, gösterilebilecek başka öğe olmadığında bunu belirlemek için bu yöntemi kullanır.

Veri listesini gösteren iç içe yerleştirilmiş bir ViewHolder içeren basit bir bağdaştırıcının tipik bir örneğini burada bulabilirsiniz. Bu durumda RecyclerView, basit bir metin öğeleri listesi gösterir. Adaptöre, ViewHolder öğelerinin metnini içeren bir dize dizisi iletilir.

Kotlin

class CustomAdapter(private val dataSet: Array<String>) :
        RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder)
     */
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // Define click listener for the ViewHolder's View
            textView = view.findViewById(R.id.textView)
        }
    }

    // Create new views (invoked by the layout manager)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        // Create a new view, which defines the UI of the list item
        val view = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.text_row_item, viewGroup, false)

        return ViewHolder(view)
    }

    // Replace the contents of a view (invoked by the layout manager)
    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.textView.text = dataSet[position]
    }

    // Return the size of your dataset (invoked by the layout manager)
    override fun getItemCount() = dataSet.size

}

Java

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

    private String[] localDataSet;

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder)
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView textView;

        public ViewHolder(View view) {
            super(view);
            // Define click listener for the ViewHolder's View

            textView = (TextView) view.findViewById(R.id.textView);
        }

        public TextView getTextView() {
            return textView;
        }
    }

    /**
     * Initialize the dataset of the Adapter
     *
     * @param dataSet String[] containing the data to populate views to be used
     * by RecyclerView
     */
    public CustomAdapter(String[] dataSet) {
        localDataSet = dataSet;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // Create a new view, which defines the UI of the list item
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.text_row_item, viewGroup, false);

        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.getTextView().setText(localDataSet[position]);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return localDataSet.length;
    }
}

Her görüntüleme öğesinin düzeni, her zamanki gibi bir XML düzen dosyasında tanımlanır. Bu durumda uygulamada aşağıdaki gibi bir text_row_item.xml dosyası vardır:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/list_item_height"
    android:layout_marginLeft="@dimen/margin_medium"
    android:layout_marginRight="@dimen/margin_medium"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/element_text"/>
</FrameLayout>

Sonraki adımlar

Aşağıdaki kod snippet'inde, RecyclerView değerini nasıl kullanabileceğiniz gösterilmektedir.

Kotlin

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val dataset = arrayOf("January", "February", "March")
        val customAdapter = CustomAdapter(dataset)

        val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = customAdapter

    }

}

Java

RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.layoutManager = new LinearLayoutManager(this)
recyclerView.setAdapter(customAdapter);

Kitaplık, uygulamanızı özelleştirmenin birçok yolunu da sunar. Daha fazla bilgi için Gelişmiş RecyclerView özelleştirme başlıklı makaleyi inceleyin.

Ek kaynaklar

Android'de test hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Örnek uygulamalar