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

"Oluştur" yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da düzenlerle nasıl çalışacağınızı öğrenin.

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

Adından da anlaşılacağı gibi RecyclerView, bu öğeleri geri dönüştürür. RecyclerView, bir öğe ekranın dışına çıktığında görünümünü bozmaz. 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ı artırırken güç tüketimini azaltır.

Temel sınıflar

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

  • RecyclerView, verilerinize karşılık gelen görünümleri içeren ViewGroup öğesidir. Görünüm kendisi olduğu için RecyclerView öğesini düzeninize diğer herhangi bir kullanıcı arayüzü öğesi gibi eklersiniz.

  • Listedeki her bir öğe, bir görünüm sahibi nesnesiyle tanımlanır. Görünüm sahibi oluşturulduğunda, bu cihazla ilişkili hiçbir veri olmaz. Görünüm sahibi oluşturulduktan sonra RecyclerView bunu kendi verilerine bağlar. Görünüm tutucuyu RecyclerView.ViewHolder uzantısını genişleterek tanımlarsınız.

  • RecyclerView, adaptördeki yöntemleri çağırarak görünümler ister ve görünümleri bu verilere bağlar. Bağdaştırıcıyı RecyclerView.Adapter uzantısını genişleterek tanımlarsınız.

  • Düzen yöneticisi, listenizdeki öğeleri ayrı ayrı düzenler. RecyclerView kitaplığı tarafından sağlanan düzen yöneticilerinden birini kullanabilir veya kendi düzen yöneticilerinizi tanımlayabilirsiniz. Düzen yöneticilerinin tümü kitaplığın LayoutManager soyut sınıfını temel alır.

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

RecyclerView'u uygulama adımları

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

  1. Listenin veya ızgaranın nasıl görüneceğine karar verin. Normal olarak, RecyclerView kitaplığının standart düzen yöneticilerinden birini kullanabilirsiniz.

  2. Listedeki her bir öğenin nasıl görüneceğini ve davranacağı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 sağlar. Görünüm sahibiniz, bir View için 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 tanımlayın.

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

Düzeninizi planlayın

RecyclerView'daki öğeler, 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 ızgarada düzenler:
    • Izgara dikey olarak düzenlenirse GridLayoutManager, her bir satırdaki tüm öğelerin aynı genişliğe ve yüksekliğe sahip olmasını sağlamaya çalışır ancak farklı satırların yükseklikleri farklı olabilir.
    • Izgara yatay olarak düzenlenirse GridLayoutManager, her sütundaki tüm öğelerin aynı genişliğe ve yüksekliğe sahip olmasını sağlamaya çalışır ancak farklı sütunlar farklı genişliklere sahip olabilir.
  • StaggeredGridLayoutManager, GridLayoutManager işlevine benzer ancak bir satırdaki öğelerin aynı yüksekliğe sahip olmasını (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 öğelerin birbirinden uzaklığı olabilir.

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

Bağdaştırıcınızı ve görünüm tutucuyu takma

Düzeninizi belirledikten sonra Adapter ve ViewHolder uygulamanız gerekir. Bu iki sınıf, verilerinizin nasıl görüntüleneceğini tanımlamak için birlikte çalışır. ViewHolder, listedeki tek bir öğenin düzenini içeren bir View öğesinin etrafında yer alan sarmalayıcıdır. Adapter, gerektiğinde ViewHolder nesne oluşturur ve bu görünümlerin verilerini de ayarlar. Görünümleri kendi verileriyle ilişkilendirme sürecine bağlama adı verilir.

Bağdaştırıcınızı tanımladığınızda üç 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çeriklerini doldurmaz. ViewHolder henüz belirli verilere bağlanmamıştır.

  • onBindViewHolder(): RecyclerView, bir ViewHolder öğesini verilerle ilişkilendirmek için bu yöntemi çağırır. Yöntem, uygun verileri getirir ve görünüm sahibinin düzenini doldurmak için verileri kullanır. Örneğin, RecyclerView bir ad listesi görüntülüyorsa yöntem, listede uygun adı bulabilir ve görünüm sahibinin 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 kalmadığında bunu kullanır.

Bir veri listesi gösteren iç içe yerleştirilmiş bir ViewHolder içeren basit bir bağdaştırıcı örneğini burada bulabilirsiniz. Bu durumda RecyclerView, metin öğelerinden oluşan basit bir liste gösterir. Bağdaştırıcıya, ViewHolder öğelerinin metnini içeren bir dize dizisi aktarılır.

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ünüm öğesinin düzeni, her zamanki gibi bir XML düzen dosyasında tanımlanır. Bu örnekte, uygulama şuna benzer bir text_row_item.xml dosyasına sahiptir:

<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'i, RecyclerView özelliğini nasıl kullanabileceğinizi göstermektedir.

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ştirmeniz için birçok yol da sunar. Daha fazla bilgi için Gelişmiş RecyclerView özelleştirme bölümünü inceleyin.

Ek kaynaklar

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

Örnek uygulamalar