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

Oluşturma yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da düzenlerle çalışma hakkında bilgi edinin.

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

Adından da anlaşılacağı gibi, RecyclerView bu bağımsız öğeleri geri dönüştürür. Bir öğe ekranın dışına kaydırıldığında RecyclerView görünümü bozulmaz. 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ştirirken 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ünümleri içeren ViewGroup öğesidir. Bu bir görünüm olduğundan düzeninize diğer kullanıcı arayüzü öğelerini eklediğiniz şekilde RecyclerView özelliğini eklersiniz.

  • Listedeki her bağımsız öğe bir görünüm sahibi nesne tarafından tanımlanır. Görünüm sahibi oluşturulduğunda kendisiyle ilişkilendirilmiş hiçbir veri olmaz. Görünüm sahibi oluşturulduktan sonra, RecyclerView onu verilerine bağlar. Görünüm sahibini, RecyclerView.ViewHolder bölümünü genişleterek tanımlarsınız.

  • RecyclerView, görüntüleme isteğinde bulunur ve bağdaştırıcıdaki yöntemleri çağırarak görünümleri verilerine bağlar. Bağdaştırıcıyı, RecyclerView.Adapter bölümü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 yerleşim yöneticinizi tanımlayabilirsiniz. Düzen yöneticileri kitaplığın LayoutManager soyut sınıfına dayanır.

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

RecyclerView uygulama adımları

RecyclerView'u 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 ızgaranın nasıl görüneceğine karar verin. Normalde, 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. Kullandığınız ViewHolder sürümü, liste öğeleriniz için tüm işlevleri sunar. Görünüm sahibiniz View etrafındaki bir sarmalayıcı ve bu görünüm RecyclerView tarafından yönetiliyor.

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

RecyclerView'unuzu ihtiyaçlarınıza göre özelleştirmenizi sağlayan gelişmiş özelleştirme seçenekleri de bulunur.

Düzeninizi planlayın

RecyclerView içindeki öğ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 ızgarada düzenler:
    • Izgara dikey olarak düzenlenmişse 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 farklı yüksekliklere sahip olabilir.
    • Izgara yatay olarak düzenlenmişse 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 özelliğine 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, birbirlerinden uzaklaşabilir.

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

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

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

Bağdaştırıcınızı tanımlarken üç temel yöntemi geçersiz kılarsınız:

  • onCreateViewHolder(): RecyclerView, yeni bir ViewHolder oluşturulması gerektiğinde bu yöntemi çağırır. Yöntem, ViewHolder öğesini 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 verilerle ilişkilendirmek için bu yöntemi çağırır. Yöntem uygun verileri getirir ve verileri kullanarak görünüm sahibinin düzenini doldurur. Örneğin, RecyclerView bir ad listesi görüntülüyorsa yöntem uygun adı listede 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 toplam adres sayısı olabilir. RecyclerView, gösterilebilecek başka öğe kalmadığını belirlemek için bunu kullanır.

Veri listesini gösteren, iç içe yerleştirilmiş bir ViewHolder öğesine sahip basit bir bağdaştırıcıya dair tipik bir örneği burada bulabilirsiniz. Bu durumda, RecyclerView basit bir metin öğeleri listesi gösterir. Bağdaştırıcıya, ViewHolder öğelerine ilişkin metni 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 durumda, uygulamanın şuna benzer 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'i, RecyclerView öğesini nasıl kullanabileceğinizi gösterir.

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.adapter = customAdapter

    }

}

Java


RecyclerView recyclerView = findViewById(R.id.recycler_view);
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üne bakın.

Ek kaynaklar

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

Örnek uygulamalar