في Android ، كلما احتجنا إلى عرض عنصر Spinner مع صورة ونص وما إلى ذلك (أي إنشاء قائمة مخصصة أكثر) ، فعلينا تنفيذ محول مخصص مثل المحول الأساسي . من أجل التخصيص ، نحتاج إلى إنشاء فئة محول مخصصة ثم توسيع محولنا الافتراضي في تلك الفئة. هنا نقوم بإنشاء قائمة مخصصة باستخدام الوظائف المتجاوزة للمحول وعرض Spinner المخصص . لمزيد من التوضيح حول كيفية تنفيذ محول مخصص ، نحتاج أولاً إلى فهم Spinner .
ملاحظة مهمة: يرتبط Spinner بعرض المحول ، لذا لملء البيانات في القرص الدوار ، نحتاج إلى استخدام إحدى فئات المحول.
كود XML الخاص بـ Spinner في Android:
<Spinner android:id="@+id/simpleSpinner " android:layout_width="fill_parent" android:layout_height="wrap_content" />
في مقتطف الشفرة أعلاه ، نقوم بتطبيق spinner بسيط في ملف xml الخاص بنا . الآن لملء البيانات في هذا القرص الدوار ، نحتاج إلى استخدام فئة المحول. سنستخدم هنا محولات مخصصة لملء البيانات المخصصة بالصور في الدوار.
إليك كيفية توسيع فئة CustomAdapter BaseAdapter:
public class CustomAdapter extends BaseAdapter { @Override public int getCount() { return 0; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { return null; }
فئة BaseAdapter في Android هي فئة Abstract . لذلك أثناء توسيعه في CustomAdapter ، فإننا نتجاوز طرقه بناءً على المتطلبات. في مقتطف الشفرة أعلاه ، تُستخدم الوظائف المتجاوزة للمحول الأساسي لتعيين البيانات في spinner أو listview أو networkview . تم وصف هذه الوظائف بالفعل في البرنامج التعليمي BaseAdapter .
نموذج رمز لفئة المحول المخصص عندما نقوم بتوسيع ArrayAdapter في ذلك:
public class MyAdapter extends ArrayAdapter { public MyAdapter(Context context, int resource, int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); } @Override public int getCount() { return super.getCount(); } @Override public View getView(int position, View convertView, ViewGroup parent) { return super.getView(position, convertView, parent); } }
في مقتطف الشفرة أعلاه ، نرى الوظائف المتجاوزة لـ ArrayAdapter والتي تُستخدم لتعيين البيانات في قائمة أو شبكة أو سبينر. تم وصف هذه الوظائف بالفعل في البرنامج التعليمي المخصص ArrayAdapter .
مثال Spinner المخصص في Android Studio
مثال 1: مثال على زر زيادة مخصص باستخدام BaseAdapter
يوجد أدناه المثال الذي عرضنا فيه أسماء الدول مع الصور في قرص دوار وكلما نقرت على عنصر ما ، سيتم عرض اسم البلد كرسالة باستخدام الخبز المحمص. فيما يلي الناتج النهائي والكود:
حدد ملف -> جديد -> مشروع جديد. املأ المتطلبات وانقر فوق الزر "إنهاء".
الخطوة 2: افتح res -> layout -> xml (or) activity_main. xml وأضف الكود التالي. نحن هنا نقوم بإنشاء Spinner داخل النسق النسبي .
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Spinner android:id="@+id/simpleSpinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="50dp" /> </RelativeLayout>
الخطوة 3: قم بإنشاء نشاط تخطيط جديد في res-> layout وقم بتسميته custom_spinner_items.xml. أضف التعليمات البرمجية التالية. نحن هنا نحدد التصميم الأساسي للعناصر المخصصة التي سيتم عرضها داخل Spinner.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/imageView" android:layout_width="50dp" android:layout_height="50dp" android:padding="5dp" android:src="@drawable/ic_launcher" /><!--Make sure image is present in Drawable folder--> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="@dimen/activity_horizontal_margin" android:text="Demo" android:textColor="#000" /> </LinearLayout>
الخطوة 4: افتح التطبيق -> جافا -> الحزمة -> النشاط الرئيسي. MainActivity وأضف الكود التالي. التفسير مدرج في الكود نفسه.
package example.abhiandriod.customspinnerexample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Spinner; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{ String[] countryNames={"India","China","Australia","Portugle","America","New Zealand"}; int flags[] = {R.drawable.india, R.drawable.china, R.drawable.australia, R.drawable.portugle, R.drawable.america, R.drawable.new_zealand}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Getting the instance of Spinner and applying OnItemSelectedListener on it Spinner spin = (Spinner) findViewById(R.id.simpleSpinner); spin.setOnItemSelectedListener(this); CustomAdapter customAdapter=new CustomAdapter(getApplicationContext(),flags,countryNames); spin.setAdapter(customAdapter); } //Performing action onItemSelected and onNothing selected @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int position,long id) { Toast.makeText(getApplicationContext(), countryNames[position], Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }
الخطوة 5: قم بإنشاء Class جديد -> java -> package and new class name CustomAdapter.java وأضف الكود التالي. هنا سوف نتجاوز طرق BaseAdapter لملء البيانات في Spinner.
package example.abhiandriod.customspinnerexample; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class CustomAdapter extends BaseAdapter { Context context; int flags[]; String[] countryNames; LayoutInflater inflter; public CustomAdapter(Context applicationContext, int[] flags, String[] countryNames) { this.context = applicationContext; this.flags = flags; this.countryNames = countryNames; inflter = (LayoutInflater.from(applicationContext)); } @Override public int getCount() { return flags.length; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { view = inflter.inflate(R.layout.custom_spinner_items, null); ImageView icon = (ImageView) view.findViewById(R.id.imageView); TextView names = (TextView) view.findViewById(R.id.textView); icon.setImageResource(flags[i]); names.setText(countryNames[i]); return view; } }
المخرج:
قم الآن بتشغيل التطبيق في Emulator / AVD وسترى القرص الدوار المخصص يعرض الأعلام وأسماء الدول معًا. قم بتغيير أسماء الدول داخل الدوار وسترى رسالة توست التي تعرض الدولة التي تم تحديدها.