Xamarin.Android
RecyclerView
खोज…
RecyclerView मूल बातें
यह Android Support Library V7 RecyclerView
का उपयोग करने का एक उदाहरण है। समर्थन पुस्तकालयों को आम तौर पर अनुशंसित किया जाता है क्योंकि वे नई सुविधाओं के पिछड़े-संगत संस्करण प्रदान करते हैं, उपयोगी यूआई तत्व प्रदान करते हैं जो फ्रेमवर्क में शामिल नहीं होते हैं, और उपयोगिताओं की एक श्रृंखला प्रदान करते हैं जो एप्लिकेशन को आकर्षित कर सकते हैं।
RecyclerView
प्राप्त करने के लिए, हम आवश्यक Nuget पैकेज स्थापित करेंगे। सबसे पहले, हम v7 recyclerview
खोज करेंगे। नीचे स्क्रॉल करें जब तक हम Xamarin Android Support Library - v7 RecyclerView
। इसे चुनें और पैकेज जोड़ें पर क्लिक करें।
वैकल्पिक रूप से, Android Support Library V7 RecyclerView
Xamarin घटक के रूप में उपलब्ध है। घटक को जोड़ने के लिए, समाधान एक्सप्लोरर में एंड्रॉइड प्रोजेक्ट के भीतर Components
पर राइट-क्लिक करें और Get More Components
पर क्लिक Get More Components
।
दिखाई देने वाले घटक स्टोर विंडो के भीतर, RecyclerView की खोज करें। खोज सूची में, Android Support Library V7 RecyclerView
। इसके बाद Add to App
पर क्लिक करें। घटक परियोजना में जुड़ जाता है।
अगला कदम RecyclerView को एक पृष्ठ पर जोड़ना है। axml
(लेआउट) फ़ाइल के भीतर, हम नीचे RecyclerView
जोड़ सकते हैं।
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />
RecyclerView को बुनियादी मानक कार्यान्वयन के लिए कम से कम दो सहायक वर्गों की आवश्यकता होती है: Adapter
और ViewHolder
। Adapter
आइटम लेआउट को फुलाता है और डेटा को एक पुनर्नवीनीकरण दृश्य के भीतर प्रदर्शित होने वाले विचारों से बांधता है। ViewHolder दिखता है और संदर्भों को संग्रहीत करता है। दृश्य धारक आइटम-व्यू क्लिक का पता लगाने में भी मदद करता है।
यहाँ एडेप्टर क्लास का एक बुनियादी उदाहरण है
public class MyAdapter : RecyclerView.Adapter
{
string [] items;
public MyAdapter (string [] data)
{
items = data;
}
// Create new views (invoked by the layout manager)
public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGroup parent, int viewType)
{
// set the view's size, margins, paddings and layout parameters
var tv = new TextView (parent.Context);
tv.SetWidth (200);
tv.Text = "";
var vh = new MyViewHolder (tv);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
public override void OnBindViewHolder (RecyclerView.ViewHolder viewHolder, int position)
{
var item = items [position];
// Replace the contents of the view with that element
var holder = viewHolder as MyViewHolder;
holder.TextView.Text = items[position];
}
public override int ItemCount {
get {
return items.Length;
}
}
}
OnCreateViewHolder
विधि में हम सबसे पहले एक View को फुलाते हैं और ViewHolder क्लास का एक उदाहरण बनाते हैं। यह उदाहरण वापस करना होगा। यह विधि एडेप्टर द्वारा लागू की जाती है, जब उसे व्यूहॉल्डर के नए उदाहरण की आवश्यकता होती है। यह विधि हर एक सेल के लिए लागू नहीं होगी। एक बार जब RecyclerView में व्यू को भरने के लिए पर्याप्त सेल होते हैं, तो यह पुराने सेल को फिर से उपयोग करेगा जो आगे की सेल के लिए व्यू से बाहर स्क्रॉल किया गया है।
OnBindViewHolder
कॉलबैक को एडाप्टर द्वारा निर्दिष्ट स्थान पर डेटा प्रदर्शित करने के लिए लगाया जाता है। इस पद्धति को आइटम की सामग्री को अद्यतन करना चाहिए ताकि दिए गए स्थान पर आइटम को प्रतिबिंबित किया जा सके।
चूँकि सेल में सिर्फ एक TextView
, इसलिए हम नीचे एक साधारण ViewHolder रख सकते हैं।
public class MyViewHolder : RecyclerView.ViewHolder
{
public TextView TextView { get; set; }
public MyViewHolder (TextView v) : base (v)
{
TextView = v;
}
}
अगला कदम है Activity
में वायर-अप करना।
RecyclerView mRecyclerView;
MyAdapter mAdapter;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
mRecyclerView = FindViewById<RecyclerView> (Resource.Id.recyclerView);
// Plug in the linear layout manager:
var layoutManager = new LinearLayoutManager (this) { Orientation = LinearLayoutManager.Vertical };
mRecyclerView.SetLayoutManager (layoutManager);
mRecyclerView.HasFixedSize = true;
var recyclerViewData = GetData();
// Plug in my adapter:
mAdapter = new MyAdapter (recyclerViewData);
mRecyclerView.SetAdapter (mAdapter);
}
string[] GetData()
{
string[] data;
.
.
.
return data;
}
LayoutManager वर्ग एक रिसाइक्लर व्यू के भीतर आइटम दृश्यों को मापने और पोजिशन करने के साथ-साथ उन आइटम दृश्यों को रीसायकल करने के लिए नीति निर्धारित करता है जो अब उपयोगकर्ता को दिखाई नहीं देते हैं। इससे पहले कि RecyclerView
, हम इस्तेमाल किया था ListView
एक खड़ी स्क्रॉल सूची में और के रूप में में कोशिकाओं की व्यवस्था करने के GridView
एक दो आयामी, स्क्रॉल ग्रिड में प्रदर्शित करने के लिए आइटम नहीं है। लेकिन अब हम एक अलग LayoutManger सेट करके RecyclerView के साथ दोनों प्राप्त कर सकते हैं। LinearLayoutManager
एक ListView के रूप में कोशिकाओं की व्यवस्था करता है और GridLayoutManager
कोशिकाओं की ग्रिड फैशन की व्यवस्था करता है।
क्लिक घटनाओं के साथ RecyclerView
यह उदाहरण दिखाता है कि एक Xamarin.Android RecyclerView में EventHandlers कैसे सेट करें।
एंड्रॉइड जावा में , एक क्लिक के लिए श्रोता को सेट करने का तरीका इस तरह से क्लिक किए जाने वाले दृश्य के लिए onClickListener का उपयोग कर रहा है:
ImageView picture = findViewById(R.id.item_picture);
picture.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// do stuff
}
});
हालाँकि, Xamarin.Android में, क्लिक इवेंट के लिए एक श्रोता को सेट करने का तरीका निम्नलिखित तरीकों से एक EventHandler जोड़कर है:
1।
ImageView picture = FindViewById<ImageView>(Resource.Id.item_picture);
picture.Click += delegate {
// do stuff
};
2।
ImageView picture = FindViewById<ImageView>(Resource.Id.item_picture);
picture.Click += async delegate {
// await DoAsyncMethod();
// do async stuff
};
3।
ImageView picture = FindViewById<ImageView>(Resource.Id.item_picture);
picture.Click += Picture_Click;
... // rest of your method
private void Picture_Click(object sender, EventArgs e)
{
// do stuff
}
ध्यान दें कि EventHandler जोड़ा गया है, सेट नहीं किया गया है। यदि क्लिक करें EventHandler को GrViewView / ListView एडॉप्टर से GetView पद्धति के अंदर या RecyclerView.Adcape से OnBindViewHolder विधि से जोड़ा जाता है, तो हर बार जब आइटम दृश्य बनाया जाता है तो एक नया EventHandler जोड़ा जाएगा। कई बार स्क्रॉल करने के बाद, कई ईवेंटहैंडलर जोड़े जाएंगे, और जब दृश्य क्लिक हो जाएगा, तो उन सभी को निकाल दिया जाएगा।
इस परेशानी से बचने के लिए, EventHandlers को सदस्यता रद्द कर दिया जाना चाहिए और बाद में GetView या OnBindViewHolder तरीकों से सदस्यता लेनी चाहिए। इसके अलावा, उन्हें EventHandler को सेट करने के लिए नंबर 3. तरीके का उपयोग करना होगा, अन्यथा इवेंटहैंडलर को अनसब्सक्राइब करना संभव नहीं होगा।
RecyclerView.Adcape का एक उदाहरण क्लिक इवेंट के साथ नीचे दिखाया गया है:
public class ViewHolderPerson : Android.Support.V7.Widget.RecyclerView.ViewHolder
{
public View Item { get; private set; }
public ImageView Picture { get; private set; }
public TextView Name { get; private set; }
public ViewHolderPerson(View itemView) : base(itemView)
{
this.Item = itemView;
this.Picture = itemView.FindViewById<ImageView>(Resource.Id.Item_Person_Picture);
this.Name = itemView.FindViewById<TextView>(Resource.Id.Item_Person_Name);
}
}
public class AdapterPersons : Android.Support.V7.Widget.RecyclerView.Adapter
{
private Context context;
private Android.Support.V7.Widget.RecyclerView recyclerView;
private List<Person> persons;
public AdapterPersons(Context context, Android.Support.V7.Widget.RecyclerView recyclerView, List<Person> persons)
{
this.context = context;
this.recyclerView = recyclerView;
this.persons = persons;
}
public override int ItemCount => persons.Count;
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
Person person = this.persons[position];
((ViewHolderPerson)holder).Name.Text = person.Name;
((ViewHolderPerson)holder).Picture.SetImageBitmap(person.Picture);
// Unsubscribe and subscribe the method, to avoid setting multiple times.
((ViewHolderPerson)holder).Item.Click -= Person_Click;
((ViewHolderPerson)holder).Item.Click += Person_Click;
}
private void Person_Click(object sender, EventArgs e)
{
int position = this.recyclerView.GetChildAdapterPosition((View)sender);
Person personClicked = this.persons[position];
if(personClicked.Gender == Gender.Female)
{
Toast.MakeText(this.context, "The person clicked is a female!", ToastLength.Long).Show();
}
else if(personClicked.Gender == Gender.Male)
{
Toast.MakeText(this.context, "The person clicked is a male!", ToastLength.Long).Show();
}
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.item_person, parent, false);
return new ViewHolderPerson(itemView);
}
}