通用的下拉适配器

  • 介绍
  • 适配器的实现
    • SpinnerAdapter
    • 适配器布局
  • 项目实战
  • 效果展示

介绍

通常一个项目中要用到好多次下拉框,但是每次下拉框的数据来源都不一样,需要展示在界面上的字段都不一样,不能每次都写一遍适配器,所以就需要通用的适配器来帮助。

适配器的实现

SpinnerAdapter

//
/** 一个通用的下拉适配器,下拉的数据的类不一样,需要展示在界面上的字段也不一样的时候* @param context  上下文* @param data    下拉的数据源* @param visibleField 用来展示的字段* @param class1   数据源的类型*/
class SpinnerAdapter<T>(val context: Context, val data:ArrayList<T>, val visibleField:String, val class1:Class<T> ) : BaseAdapter() {//下拉中每个item的显示的样子override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {val view: Viewif (convertView==null){view= LayoutInflater.from(context).inflate(R.layout.item_spinner,parent,false)}else{view =convertView}val textView= view.findViewById<TextView>(R.id.textView)//获取到当前位置的item数据val dic:T=getItem(position)//通过反射得到该字段的值,并且显示在textview上面val nameField: Field = class1.getDeclaredField(visibleField)nameField.isAccessible=trueif (nameField.get(dic)==null){ //如果该字段的值为null的话val text="null"textView.text=text}else{val text:String=nameField.get(dic) as StringtextView.text=text}return view;}override fun getItem(position: Int): T{return data[position]}override fun getItemId(position: Int): Long {return position.toLong();}override fun getCount(): Int {return  data.size;}}

适配器布局

item_spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="5dp"android:layout_marginVertical="5dp"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="match_parent"android:text="TextView"android:textSize="16sp"android:textColor="@color/black"android:gravity="center_vertical"/>
</LinearLayout>

项目实战

两个类充当不同的数据来源

//数据字典的类
data  class Dictionary(val label:String,val value:String)//一个普通的学生类
data  class Student(val id:String,val name:String,val no:String)

新建一个空的activity

布局里面放了两个spinner,用来展示两个不同数据来源的下拉框

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Spinnerandroid:id="@+id/studentSpinner"android:layout_width="match_parent"android:layout_height="40dp" /><Spinnerandroid:id="@+id/dicSpinner"android:layout_width="match_parent"android:layout_height="40dp" /></androidx.appcompat.widget.LinearLayoutCompat >

activity逻辑
(如果要获取选中的item, 以数据字典下拉为例 val item =dicSpinner.selectedItem as Dictionary ,就可以拿到然后就可以取item的任何字段来进行传递到数据库保存了)

class MainActivity : AppCompatActivity() {lateinit var studentAdapter:SpinnerAdapter<Student>lateinit var dictionaryAdapter:SpinnerAdapter<Dictionary>val studentList= arrayListOf<Student>()val dictionaryList= arrayListOf<Dictionary>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//学生下拉框配置(需要显示在界面上的值是name字段)studentAdapter= SpinnerAdapter(this,studentList,"name",Student::class.java)//studentSpinner 没有findviewbyid是因为有插件,直接用布局里面的id作为变量名了studentSpinner.adapter=studentAdapter//字典下拉框配置(需要显示在界面上的值是label字段)dictionaryAdapter= SpinnerAdapter(this,dictionaryList,"label",Dictionary::class.java)dicSpinner.adapter=dictionaryAdapterdoQueryDictionary()//查询字典数据doQueryStudent()//查询学生数据}//假装从网络查来的private fun doQueryDictionary(){dictionaryList.add(Dictionary("北京","BJ"))dictionaryList.add(Dictionary("上海","SH"))dictionaryList.add(Dictionary("杭州","HZ"))dictionaryAdapter.notifyDataSetChanged()}//假装从网络查来的private fun doQueryStudent(){studentList.add(Student("1","小张","20220507001"))studentList.add(Student("2","小王","20220507002"))studentList.add(Student("3","小陈","20220507003"))studentAdapter.notifyDataSetChanged()}}

效果展示


Android一个通用的下拉框适配器(kotlin版本)相关推荐

  1. Android UI自定义Spinner下拉框(用popuwindow实现)-转

    定义出第一个图片的布局和弹出框(一个listView)的布局,,这里就不在多说了~ListView需要自己定义一个MyspinnerAdapter~做好这些准备之后,就是弹出框的实现了~  prote ...

  2. Android 可以输入的下拉框

    将AutoCompleteTextView与一个button组合起来,做成一个可以输入,也可以选择的下拉框. 下面是定义的xml文件,auto_spinner.xml: 1 <?xml vers ...

  3. 使用微信小程序做一个简易的下拉框,无动画效果,纯原生写法(下拉列表框)

    最近在开发的时候,需要使用下拉的效果,但是之前并没有进行书写过,今天做一个简单的demo,来记录一下微信小程序开发的下拉框效果. 微信小程序和jquery最大的区别就是是否操作dom, 微信小程序无需 ...

  4. 怎么在Android布局里面写下拉框,Android CoordinatorLayout(六) 加入下拉功能

    上章讲了CoordinatorLayout的卡顿BUG,既然有BUG又没解决,说实话没必要讲下去,但是做事总要有始有终,既然写了就把它写完吧,顶着BUG去写. 四.CoordinatorLayout ...

  5. 一个常见的下拉框(css)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Android可输入的下拉框,android 可编辑的下拉框 Demo

    [实例简介] NULL 博文链接:https://royal2xiaose.iteye.com/blog/1501473 [实例截图] [核心代码] editDropdownTextbox └── e ...

  7. android spinner下拉框

    下拉框其实自己很少用到,不过昨天因为写界面时,自己用到了,当时忘记怎么写,所以在网上找了一下资料,做了一个自定义的下拉框.这里,自己把所做的记录一下,以免自己以后还需要到网上查找. 1.用androi ...

  8. Android第三方开源下拉框:NiceSpinner

     Android第三方开源下拉框:NiceSpinner Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Andro ...

  9. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下 ...

最新文章

  1. “照骗”难逃Adobe的火眼金睛——用机器学习让P图无所遁形
  2. C#中equal与==的区别
  3. 在JAVA中使用MongoDB
  4. 盘它:1200 天积淀,超 750 篇干货,为你甄选这 100 + 篇精华!
  5. linux 修改网卡mac,Linux修改 网卡物理地址(Mac Address)
  6. Python基础——PyCharm版本——第七章、面向对象编程
  7. Axure之全局变量
  8. 【POJ - 1050】To the Max (dp)
  9. PostgreSql 分页limit
  10. 5G的基站覆盖范围300米,今后边远地区的手机通话怎样保证?
  11. python核心编程--笔记(不定时跟新)(转)
  12. opencv摄像头速度慢_opencv 摄像头操作详解
  13. 金庸武侠内功排行榜TOP10
  14. 比较有意思的.NET反调—《.NET在蹉跎中一路前行》
  15. plantcare的html打开空白,PlantCARE, a plant cis-acting regulatory element database
  16. 微信小程序仿记事本,带下划线,自动换行,高度自增
  17. R语言使用na.omit函数删除向量数据中的缺失值(NA值)
  18. Windows蓝牙设备自动断开问题
  19. 第一章:电子商务的概述
  20. ITUNE清理“其他”的内容

热门文章

  1. 屏蔽FlashCookie
  2. dedecms 主要模板文件与功能说明
  3. orangepi pc lubuntu 设置分辨率
  4. python画二维温度云图_lammps温度云图
  5. P25边缘保留滤波(EPF滤波)
  6. 数据库备份 语句
  7. JAVA - Map
  8. 测试用例: 电话号码
  9. 【模拟】图书馆书目检索
  10. lin通讯从节点同步间隔场_Freescale MM908E625的LIN总线