Android常用控件Spinner的使用方法大全
Spinner介紹
在Android開發(fā)過程中,Spinner下拉控件是比較常用的控件,它可以以下拉框和dialog的方式進行展示。默認是下拉框方式。
Spinner效果
上圖可以看出實現(xiàn)Spinner的方式有兩種:
一、ArrayAdater 數(shù)組適配器
二、自定義適配器。
ArrayAdapter所需要的代碼
1、布局界面activity_main.xml代碼
2、MainActivity.java代碼
3、spinner.item_1.xml代碼
@BindView()代碼解釋
首先說明一下@BindView的作用,從字面意思可以看出這個意思是:綁定視圖。
他的作用等同于 spinner=findViewById(R.id.main_spinner);,
需要使用的小伙伴可以在app目錄下的bulid.grale中添加這二行代碼。
implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'`
然后在MainAcitivty.java的Oncreate方法里面添加 ButterKnife.bind(this);
下面是bind的兩個參數(shù)
public static Unbinder bind(@NonNull Object target, @NonNull View source) {} //Obejct:默認填this //source:這里需要加入View,在自定義適配器中有用到
class ViewHolder { @BindView(R.id.spinner_item_2_imageView) ImageView imageView2; @BindView(R.id.spinner_item_2_name) TextView name2; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
ArrayAdapter代碼解析
String:在這里不一定是String,也可以是int ,float,double等等,根據(jù)你數(shù)據(jù)的類型判斷這里改填什么
getBaseContext:這里需要傳入Context的對象,直接getBaseContext或者getContext都可以。
R.layout.spinner.item_1:這里需要傳入一個布局,直接new Layout Resouce File就可以了。
data:數(shù)據(jù)源
ArrayAdapter數(shù)組適配器 也就介紹完了,看起來還是很簡單,接下來,我們需要實現(xiàn)圖片+文字的方式出現(xiàn),需要使用到自定義適配器了。
自定義適配器所需要的代碼
1、activity.main.xml布局
<Spinner android:id="@+id/main_spinner2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:spinnerMode="dropdown" /> //android:spinnerMode="dropdown" dialog方式展示
2、spinner.item_2.xml代碼
<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/spinner_item_2_imageView" android:layout_width="match_parent" android:layout_height="80dp" android:layout_weight="1" android:src="@drawable/ic_launcher_background" /> <TextView android:id="@+id/spinner_item_2_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:gravity="center" android:text="下拉框1"/> </LinearLayout> //由于TextView和ImageView在同一個LinearLayout中,我們將布局平分兩部分 //在View中分別添加android:layout_weight="1"
3、SpinnerBean.java代碼
public class SpinnerBean { int ImageView; String name; public int getImageView() { return ImageView; } public void setImageView(int imageView) { ImageView = imageView; } public String getName() { return name; } public void setName(String name) { this.name = name; } public SpinnerBean(int imageView, String name) { ImageView = imageView; this.name = name; } }
4、SpinnerAdapter.java
public class SpinnerAdapter extends BaseAdapter { Context context; List<SpinnerBean> mDatas; public SpinnerAdapter(Context context, List<SpinnerBean> mDatas) { this.context = context; this.mDatas = mDatas; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int posiiton, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.spinner_item_2, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.imageView2.setImageResource(mDatas.get(posiiton).getImageView()); holder.name2.setText(mDatas.get(posiiton).getName()); return convertView; } class ViewHolder { @BindView(R.id.spinner_item_2_imageView) ImageView imageView2; @BindView(R.id.spinner_item_2_name) TextView name2; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
5、MainActivty.java代碼
List<SpinnerBean> customData; private void initSpinner2() { customData = new ArrayList<>(); SpinnerBean spinnerBean = new SpinnerBean(R.drawable.ic_launcher_background, "下拉框1"); SpinnerBean spinnerBean2 = new SpinnerBean(R.mipmap.ic_launcher_round, "下拉框2"); SpinnerBean spinnerBean3 = new SpinnerBean(R.drawable.ic_launcher_background, "下拉框3"); SpinnerBean spinnerBean4 = new SpinnerBean(R.mipmap.ic_launcher_round, "下拉框4"); SpinnerBean spinnerBean5 = new SpinnerBean(R.drawable.ic_launcher_background, "下拉框5"); SpinnerBean spinnerBean6 = new SpinnerBean(R.mipmap.ic_launcher_round, "下拉框6"); SpinnerBean spinnerBean7 = new SpinnerBean(R.drawable.ic_launcher_background, "下拉框7"); SpinnerBean spinnerBean8 = new SpinnerBean(R.mipmap.ic_launcher_round, "下拉框8"); SpinnerBean spinnerBean9 = new SpinnerBean(R.drawable.ic_launcher_background, "下拉框9"); customData.add(spinnerBean); customData.add(spinnerBean2); customData.add(spinnerBean3); customData.add(spinnerBean4); customData.add(spinnerBean5); customData.add(spinnerBean6); customData.add(spinnerBean7); customData.add(spinnerBean8); customData.add(spinnerBean9); SpinnerAdapter spinnerAdapter = new SpinnerAdapter(getBaseContext(), customData); spinner2.setAdapter(spinnerAdapter); }
自定義適配器代碼解析
首先介紹一下為什么需要創(chuàng)建SpinnerBean,java和spinner.item_2.xml。
使用Android已有的適配器只能指定一個數(shù)據(jù)類型,無法加載由多個(String、int)組成的Bean,這些就使用到Java中的泛型
List泛型的作用:可以動態(tài)的添加索引序列。其中SpinnerBean.java就給我們展示如何定義一個泛型。
int ImageView; String name; public SpinnerBean(int imageView, String name) { ImageView = imageView; this.name = name; } //按住alt+int鍵 快速構(gòu)建get、set和構(gòu)造方法 //創(chuàng)建好之后,在MainAcitivty中new List<SpinnerBean>就可以添加數(shù)據(jù)了
SpinnerAdapter自定義適配器
自定義適配器中有四種方法:getCount(),getItem(),getItemId(),getView()
getCount():獲取數(shù)據(jù)的總條數(shù)
getItem():獲取索引值所對應(yīng)的對象
getItemId():獲取索引值所對應(yīng)的對象名稱
getView():獲取界面
前三個比較容易理解,說一下第四個getView()
position:表示位置
convertView:這里是自定義適配器優(yōu)化的一個方面,可以對一個View進行緩存,只需要改變數(shù)據(jù)即可,不用創(chuàng)建getCount()個View。
parent:…
convertView內(nèi)存優(yōu)化的代碼
ViewHolder holder = null; if (convertView == null) {//convertView暫時還沒有布局 //將需要展示的layout賦值給convertView,方便使用 convertView = LayoutInflater.from(context).inflate(R.layout.spinner_item_2, null); //將帶有convertView的ViewHolder賦值給holder holder = new ViewHolder(convertView); //設(shè)置View convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); }
總結(jié)
到此這篇關(guān)于Android常用控件Spinner的使用方法詳解的文章就介紹到這了,更多相關(guān)Android控件Spinner使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android用代碼獲取手機root之后的最高權(quán)限
機得root之后通過代碼可以獲得最高權(quán)限如果沒有root的話請不要往下看,毫無意義,root之后的朋友可以參考下本文或許有意想不到的收獲2013-03-03Android嵌套滾動與協(xié)調(diào)滾動的實現(xiàn)方式匯總
如何實現(xiàn)這種協(xié)調(diào)滾動的布局呢,我們使用CoordinatorLayout+AppBarLayout或者CoordinatorLayout+Behavior實現(xiàn),另一種方案是MotionLayout,我們看看都是怎么實現(xiàn)的吧2022-06-06Android應(yīng)用退出登錄的實現(xiàn)方法
每一個app都會有一個”退出登陸”的功能,當點擊退出之后需要將所有的Activity都finish掉,開始是想將棧中的所有Activity清除掉,但是沒有找到方法,后來用廣播實現(xiàn)了。下面小編給大家分享android應(yīng)用退出登錄的實現(xiàn)方法,需要的朋友參考下2017-04-04Android修改DatePicker字體顏色及分割線顏色詳細介紹
這篇文章主要介紹了Android修改DatePicker字體顏色及分割線顏色詳細介紹的相關(guān)資料,需要的朋友可以參考下2017-05-05Android三種方式生成矢量圖之VectorDrawable類使用詳解
這篇文章主要介紹了Android三種方式生成矢量圖的VectorDrawable類,2014年6月26日的I/O?2014開發(fā)者大會上谷歌正式推出了Android?L,它帶來了全新的設(shè)計語言Material?Design,新的API也提供了這個類VectorDrawable2023-02-02Android帶進度條的文件上傳示例(使用AsyncTask異步任務(wù))
這篇文章主要介紹了Android帶進度條的文件上傳示例(使用AsyncTask異步任務(wù)),使用起來比較方便,將幾個方法實現(xiàn)就行,感興趣的小伙伴們可以參考一下。2016-11-11