RecyclerView ile dinamik listeler oluşturma 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. Sizin tedarikiniz her bir öğenin nasıl göründüğünü tanımlamaya ve RecyclerView kitaplığına gerekli olduğunda öğeleri dinamik olarak oluşturur.

Adından da anlaşılacağı gibi RecyclerView, bu öğeleri geri dönüştürür. Bir RecyclerView, 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ır. güç tüketimini azaltır.

Temel sınıflar

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

  • RecyclerView görüntülemeleri içeren ViewGroup bu verilere karşılık gelecektir. Bu bir görünüm olduğu için RecyclerView ekleyin.

  • Listedeki her bir öğe, bir görünüm sahibi nesnesiyle tanımlanır. Zaman görünüm sahibi oluşturulduğunda, onunla ilişkilendirilmiş hiçbir veri yoktur. Şu tarihten sonra: görünüm sahibi oluşturulduğunda, RecyclerView bunu kendi verilerine bağlar. Siz öğesini genişleterek görünüm sahibini RecyclerView.ViewHolder.

  • RecyclerView, görüntülemeleri ister ve görünümleri, kendi verilerine bağlar. adaptördeki yöntemleri çağırarak. Bağdaştırıcıyı RecyclerView.Adapter.

  • Düzen yöneticisi, listenizdeki öğeleri ayrı ayrı düzenler. Şunları yapabilirsiniz: RecyclerView kitaplığı tarafından sağlanan düzen yöneticilerinden birini kullanın veya kendinizi tanımlayın. Düzen yöneticilerinin tümü kitaplığın LayoutManager soyut sınıf.

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

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. Normalde, RecyclerView kitaplığının standart düzen yöneticilerinden birini kullanın.

  2. Listedeki her bir öğenin nasıl görüneceğini ve davranacağını tasarlayın. Merkezli bu tasarımda ViewHolder sınıfını genişletin. Sahip olduğunuz ViewHolder sürümü liste öğeleriniz için tüm işlevleri sunar. Görünüm sahibiniz: sarmalayıcı bir View içine yerleştirilir 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, gelişmiş özelleştirme seçenekleri de vardır seçenekleri kullanarak RecyclerView'u tam ihtiyaçlarınıza göre ayarlayın.

Düzeninizi planlayın

RecyclerView'daki öğeler LayoutManager sınıfını kullanır. RecyclerView kitaplığı, en yaygın düzen durumları:

  • LinearLayoutManager öğeleri tek boyutlu bir listede düzenler.
  • GridLayoutManager , öğeleri iki boyutlu bir ızgarada düzenler:
    • Izgara dikey olarak düzenlenirse GridLayoutManager tüm öğeleri aynı hizaya her bir satırdaki öğeler aynı genişliğe ve yüksekliğe ancak farklı satırlara sahip farklı yüksekliklere sahip olabilir.
    • Izgara yatay olarak ayarlanırsa GridLayoutManager, tüm yatay her sütundaki öğeler aynı genişliğe ve yüksekliğe sahip, ancak farklı sütunları farklı genişliklere sahip olabilir.
  • StaggeredGridLayoutManager GridLayoutManager ile benzerdir; ancak satır aynı yüksekliğe (dikey ızgaralar için) veya aynı sütundaki öğelere sahip aynı genişliğe sahip olmalıdır (yatay ızgaralar için). Sonuç olarak, bu öğeler birbirlerinden uzaklaştırılabilir.

Ayrıca, tek tek öğelerin düzenini de tasarlamanız gerekir. Buna ihtiyacınız var düzeni değiştirin.

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

Düzeninizi belirledikten sonra, Adapter ve ViewHolder. Bu iki sınıf, verilerinizin nasıl depolanacağını tanımlamak için görüntülenir. ViewHolder, şunu içeren bir View öğesinin etrafında bulunan sarmalayıcıdır: düzen oluşturabilirsiniz. Adapter, ViewHolder oluşturur ve bu görünümler için verileri de ayarlar. Süreç, görünümleri kendi verileriyle ilişkilendirmeye 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, her seferinde bu yöntemi çağırır yeni bir ViewHolder oluşturması gerekiyor. Yöntem, ViewHolder ve ilişkili View ancak görünümü doldurmaz içinde yer alır. 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. İlgili içeriği oluşturmak için kullanılan yöntemi uygun verileri getirir ve görünümü doldurmak için verileri kullanır düzenlemenizi sağlar. Örneğin, RecyclerView bir ad listesi görüntülüyorsa yöntem, listeden uygun adı bulabilir ve sahibinin TextView widget'ı.

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

Aşağıda, iç içe yerleştirilmiş bir ViewHolder bulunan basit bir bağdaştırıcıya ilişkin tipik bir örnek verilmiştir: veri listesi görüntülenir. Bu durumda RecyclerView, basit bir liste oluşturabilirsiniz. Bağdaştırıcıya, ViewHolder öğeleri için.

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 daha fazla bilgi için Advanced RecyclerView Özelleştirme hakkında daha fazla bilgi edinin.

Ek kaynaklar

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

Örnek uygulamalar