RecyclerView ile dinamik listeler oluşturun Android Jetpack'in bir parçasıdır.
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çerenViewGroup
öğesidir. Bu bir görünüm olduğundan düzeninize diğer kullanıcı arayüzü öğelerini eklediğiniz şekildeRecyclerView
ö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.
Listenin veya ızgaranın nasıl görüneceğine karar verin. Normalde, RecyclerView kitaplığının standart düzen yöneticilerinden birini kullanabilirsiniz.
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ızViewHolder
sürümü, liste öğeleriniz için tüm işlevleri sunar. Görünüm sahibinizView
etrafındaki bir sarmalayıcı ve bu görünümRecyclerView
tarafından yönetiliyor.Verilerinizi
ViewHolder
görünümleriyle ilişkilendirenAdapter
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.
- Izgara dikey olarak düzenlenmişse
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 birViewHolder
oluşturulması gerektiğinde bu yöntemi çağırır. Yöntem,ViewHolder
öğesini ve ilişkiliView
öğ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
, birViewHolder
öğ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 sahibininTextView
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.