ساخت Spinner با Checkbox در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ساخت Spinner با Checkbox در اندروید می پردازیم منظور ساخت spinner که آیتم های آن قابلیت CheckBox را داشته باشد و شما بتوانید چندین آیتم را انتخاب کنید و بتوانید نتیجه آن را دریافت کنید در ادامه با ما همراه باشید.
به صورت معمول همچین چیزی امکان پذیر نیست پس ما باید آداپتور و Model سفارشی خودمان را درست کنیم.
ابتدا یک layout برای این منظور درست می کنیم پس در res/layout یک فایل از نوع xml به نام spinner_item.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <CheckBox android:id="@+id/checkbox" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:button="@null" android:drawableRight="?android:attr/listChoiceIndicatorMultiple" android:text="متن" /> </RelativeLayout> |
در بالا Checkbox را با استفاده از یک trick فارسی یا rtl کردیم !
خب یک کلاس Model به نام StateVO.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package ir.programchi; public class StateVO { private String title; private boolean selected; public StateVO() { } public StateVO(String title, boolean selected) { this.title = title; this.selected = selected; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } } |
کلاس بالا کلاس POJO یا Model ماست. دو فیلد در نظر گرفتیم title مربوط به هر یک از checkbox ها و state یا حالت مربوط به check ها (true یا false بودن آنها)
بعد از اینکار یک کلاس آداپتور مثل زیر ایجاد کنید نام آن برابر با MyAdapter.java است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package ir.programchi; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import ir.programchi.StateVO; import ir.programchi.R; public class MyAdapter extends ArrayAdapter<StateVO> { private Context mContext; private ArrayList<StateVO> listState; private MyAdapter myAdapter; private boolean isFromView = false; public MyAdapter(Context context, int resource, List<StateVO> objects) { super(context, resource, objects); this.mContext = context; this.listState = (ArrayList<StateVO>) objects; this.myAdapter = this; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent); } @Override public View getView(int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent); } public View getCustomView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { LayoutInflater layoutInflator = LayoutInflater.from(mContext); convertView = layoutInflator.inflate(R.layout.spinner_item, null); holder = new ViewHolder(); holder.mCheckBox = (CheckBox) convertView.findViewById(R.id.checkbox); holder.tv_spinner = (TextView) convertView.findViewById(R.id.tv_spinner); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.mCheckBox.setText(listState.get(position).getTitle()); isFromView = true; holder.mCheckBox.setChecked(listState.get(position).isSelected()); isFromView = false; if ((position == 0)) { holder.mCheckBox.setVisibility(View.GONE); holder.tv_spinner.setVisibility(View.VISIBLE); holder.tv_spinner.setText(listState.get(position).getTitle()); } else { holder.mCheckBox.setVisibility(View.VISIBLE); holder.tv_spinner.setVisibility(View.GONE); } holder.mCheckBox.setTag(position); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); Toast.makeText(mContext, "" + getPosition, Toast.LENGTH_SHORT).show(); } }); return convertView; } private class ViewHolder { private CheckBox mCheckBox; private TextView tv_spinner; } } |
آداپتور تمامی بخش ها را برای ما درست می کنید فقط کافی است ما مقادیری را همانند یک list از نوع Model که درست کردیم و context به آن پاس بدهیم که در ادامه این کار را انجام میدهیم.
در layout که می خواید spinner را لود کنید یک spinner همانند زیر تعریف کنید.
1 2 3 4 5 6 | <Spinner android:id="@+id/type_of_product" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.5" android:spinnerMode="dropdown" /> |
بعد از این کار در اکتیویتی مربوط آن را find می کنیم مثل زیر و کدهای load کردن spinner را قرار میدهیم.
1 2 3 4 5 6 7 8 9 10 | Spinner type_of_product = (Spinner)FindViewById(R.id.type_of_product); ArrayList<StateVO> listVOs = new ArrayList<>(); for (int i = 0; i < getResources().getStringArray(R.array.product_type_list).length; i++) { StateVO stateVO = new StateVO(); stateVO.setTitle(getResources().getStringArray(R.array.product_type_list)[i]); stateVO.setSelected(false); listVOs.add(stateVO); } MyAdapter myAdapter = new MyAdapter(LoginActivity.this, 0, listVOs); type_of_product.setAdapter(myAdapter); |
در بالا setSelected تعیین می کند که آیا به صورت default مقدار checkbox ها true یا false باشد. و در مورد product_type_list که برای شما خطا دارد وارد مسیر res/values/ شده فایل strings.xml را باز کرده و همانند زیر یک آرایه در آنجا تعریف کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <string-array name="product_type_list"> <item>گندم</item> <item>جو</item> <item>تخم مرغ</item> <item>خیار</item> <item>هویج</item> <item>گوشت</item> <item>کلم</item> <item>سیب</item> <item>پرتقال</item> <item>گوجه</item> <item>مرغ</item> <item>سایر</item> </string-array> |
موفق باشید.