Android 下拉选择框自定义view

2023-11-13

首先来看一下实现的效果

基本思路:继承PopupWindow的自定义View

说明:下图这部分自己布局,本文中主要说明的是点击某个分类显示的下拉实现

第一步:自定义 SpinnerPopuwindow继承PopupWindow


/**
 * Created by sws on 2019-04-28.
 * from:
 * describe:
 */

public class SpinnerPopuwindow extends PopupWindow {

    private View conentView;
    private ListView listView;
    private SpinnerPopAdapter adapter;
    private Activity context;
    private TextView pop_title;
    private TextView pop_cancel;
    /**
     * @param context 上下文
     * @param string 获取到未打开列表时显示的值
     * @param list 需要显示的列表的集合
     * @param itemsOnClick listview在activity中的点击监听事件
     */
    @SuppressLint("InflateParams")
    public SpinnerPopuwindow(final Activity context, final String string, final List<String> list, AdapterView.OnItemClickListener itemsOnClick) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context =context;
        conentView = inflater.inflate(R.layout.popuwindow_spinner, null);
        // 设置SelectPicPopupWindow的View
        this.setContentView(conentView);
        // 设置SelectPicPopupWindow弹出窗体的宽
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        //    this.setWidth(view.getWidth());
        // 设置SelectPicPopupWindow弹出窗体的高
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置SelectPicPopupWindow弹出窗体可点击
        this.setFocusable(true);
        // 刷新状态
        this.update();
        this.setOutsideTouchable(false);
        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
        this.setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss() {
                darkenBackground(1f);
            }
        });
        //解决软键盘挡住弹窗问题
        this.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);
        this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

        // 设置SelectPicPopupWindow弹出窗体动画效果
        //  this.setAnimationStyle(R.style.AnimationPreview);

        adapter = new SpinnerPopAdapter(context,list);
        listView = (ListView) conentView.findViewById(R.id.listView);
        listView.setOnItemClickListener(itemsOnClick);
        listView.setAdapter(adapter);
        // setAdapter是异步进行的,为了使弹窗能即时刷新,所以使用post+Runnable
        listView.post(new Runnable() {
            @Override
            public void run() {
                //主要是为了比对未打开列表时显示的值和列表中的值进行默认选中
                for(int j = 0;j<list.size();j++){
                    if(string.equals(list.get(j).toString())){
                        listView.setItemChecked(j, true);//listview自带的方法
                    }else {
                        listView.setItemChecked(j, false);
                    }
                }
            }
        });

        pop_title = (TextView) conentView.findViewById(R.id.pop_title);
//        pop_cancel = (TextView) conentView.findViewById(R.id.pop_cancel);
//
//        pop_cancel.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                dismiss();
//                darkenBackground(1f);
//            }
//        });
    }

    //给下拉列表的设置标题,增加复用性
    public void setTitleText(String str){
        pop_title.setText(str);
    }
    //获取选中列表中的数据所对应的position
    public int getText(){
        return listView.getCheckedItemPosition();
    }

    /**
     * 显示popupWindow
     *
     * @param parent
     */
    public void showPopupWindow(View parent) {
        if (!this.isShowing()) {
            // 以下拉方式显示popupwindow
              this.showAsDropDown(parent);
//             this.showAsDropDown(parent,0,10);
//            this.showAtLocation(parent, Gravity.BOTTOM|Gravity.CENTER, 0, 0);
            darkenBackground(0.9f);//弹出时让页面背景回复给原来的颜色降低透明度,让背景看起来变成灰色
        }
    }
    /**
     * 关闭popupWindow
     */
    public void dismissPopupWindow() {
        this.dismiss();
        darkenBackground(1f);//关闭时让页面背景回复为原来的颜色

    }
    /**
     * 改变背景颜色,主要是在PopupWindow弹出时背景变化,通过透明度设置
     */
    private void darkenBackground(Float bgcolor){
        WindowManager.LayoutParams lp = context.getWindow().getAttributes();
        lp.alpha = bgcolor;
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        context.getWindow().setAttributes(lp);
    }
}

 本类中主要是创建一个PopupWindow,并编写他的显示、关闭,点击监听,设置标题等方法,你可以按照你的需求更改背景颜色、弹出窗体的宽高等。

需要用到的列表布局如下 :一个简单的listview和标题TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">
    <TextView
        android:id="@+id/pop_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="6dp"
        android:gravity="center"
        android:textSize="@dimen/text14"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/hui"/>
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#00000000"
        android:choiceMode="singleChoice"
        >
    </ListView>
</LinearLayout>

 第二步:在要使用下拉列表的Activity中创建

 

/** 项目类型数据*/
private List<String> lxData;

private SpinnerPopuwindow lxSpinnerPopuwindow;


//在页面上项目类型按钮的点击监听中加一下代码

type_lx = tvlx.getText().toString();
                lxSpinnerPopuwindow = new SpinnerPopuwindow( StreetDeviceListActivity.this,type_lx,lxData,lxitemsOnClick);
//type_lx:选择某一项后显示选中内容的TextView
                lxSpinnerPopuwindow.showPopupWindow(llSX);//llSX是指此下拉列表要显示在那个view下边
                lxSpinnerPopuwindow.setTitleText("项目类型");//给下拉列表设置标题

第三步:为下拉列表设置监听

 private AdapterView.OnItemClickListener lxitemsOnClick = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String value = lxData.get(lxSpinnerPopuwindow.getText());
            tvlx.setText(value);
            lxSpinnerPopuwindow.dismissPopupWindow();

           //TODO 这儿写点击某一项之后你要执行的代码

        }
    };

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 下拉选择框自定义view 的相关文章

随机推荐

  • poj1240

    本题为已知M 叉树的前序遍历与后序遍历 要求给出对应树有多少种可能 与poj2255类似 只要划分出子树 就把问题规模缩小了 然后就可以递归 目前只会写递归 M叉树的前序遍历为 根 子树1 子树2 子树K K lt M M叉树的后序遍历为
  • Unity 解决视频放入unity 报错VideoClip import error/Could not find supported video track

    原因 编码格式不对 具体支持什么编码 不想去查 懒 解决方案 通过格式化工厂修改编码格式 步骤如下 1 下载安装格式化工厂 2 选择MP4 3 添加你要转换格式的视频 5 点击输出配置 更改视频编码如图所示 确定 6 点击开始转换 成功后点
  • ThreadLocal的学习

    ThreadLocal叫做线程变量 意思是ThreadLocal中填充的变量属于当前线程 该变量对其他线程而言是隔离的 也就是说该变量是当前线程独有的变量 ThreadLocal为变量在每个线程中都创建了一个副本 那么每个线程可以访问自己内
  • MVC在Web系统中的模式与应用

    摘要 面向对象的设计模式是经验的总结 MVC思想是原先用于构建用户界面的 这篇文章主要论述了如何在新的Web应用领域中使用设计模式和MVC架构 文章首先介绍了设计模式的概念和特点 以及MVC架构的设计思想 并分析了MVC架构中包含的几种主要
  • 基于对象语言

    所谓的基于对象语言 指的是在程序的内部已经为用户提供好若干个对象 用户直接使用这些对象即可 如 javascript
  • RSA算法的数论原理与实现

    RSA算法的数论原理与实现 RSA算法是一种常用的非对称加密算法 能够确保数据的安全性和完整性 其基本原理是利用大素数的乘积进行加密和解密操作 而且在目前的计算机领域中 RSA算法被广泛应用于各种网络通信和数据传输中 一 数论知识和原理 质
  • 电脑预览,电脑怎么预览psd格式?

    经常使用PS的朋友们都知道Photoshop文档的默认格式是psd格式 可是在电脑上可能不能像jpg图片一样显示缩略图预览 遇到这种情况我们该怎么办 要是电脑上并没有安装PS软件又该怎么预览 下面我们就一起来看看哪些解决方法 步骤如下 方法
  • Mysql中having语句与where语句的用法与区别

    分析 回答 我们在写sql语句的时候 经常会使用where语句 很少会用到having 其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别 having子句在查询过程中慢于聚合语句 sum min max
  • 网络安全——数据链路层安全协议

    作者简介 一名云计算网络运维人员 每天分享网络与运维的技术与干货 座右铭 低头赶路 敬事如仪 个人主页 网络豆的主页 目录 前言 一 数据链路层安全协议简介 1 数据链路安全性 二 局域网数据链路层协议 1 本地链路局域网 LAN 2 广域
  • 学习笔记:简谈推挽电路

    推挽电路 push pull 就是两个不同极性晶体管间连接的输出电路 推挽电路采用两个参数相同的功率BJT管或MOSFET管 以推挽方式存在于电路中 各负责正负半周的波形放大任务 电路工作时 两只对称的功率开关管每次只有一个导通 所以导通损
  • 数据库数据恢复-Oracle数据库数据恢复案例

    数据库数据恢复环境 Oracle数据库ASM磁盘组有4块成员盘 数据库故障 分析 Oracle数据库ASM磁盘组掉线 ASM实例无法挂载 用户联系我们要求恢复oracle数据库 数据库数据恢复工程师拿到磁盘后 先将所有磁盘以只读方式进行扇区
  • 第六天 01-hydra工具windows远程桌面的密码爆破

    windows远程桌面的密码爆破 概述 RDP是Windows的远程桌面协议 所占用的端口默认为3389 这个是可以修改的 要求 我们要暴力破解3389号端口的前提是对方的3389号端口是开放的 爆破工具 kali使用hydra 九头蛇 工
  • python文件开头两行#!/usr/bin/python和# -*- coding:utf-8 -*-解释以及Pycharm自动创建py文件头部信息

    我们常见到python文件的前两行都会写上如下两行代码 下面我分别解释这两条语句的意义 并介绍pycharm中自动生成py文件头部信息的方法 usr bin env python coding utf 8 或者 usr bin python
  • vs2019 中编译和使用 protobuf 库

    背景 protobuf 是一种跨平台的序列化结构数据的方法 可用于网络数据传输及存储 本文对使用 vs2019 编译 protobuf 库文件进行说明 相关代码及安装文件均来自官网下载 VS2019 编译 protobuf 生成 sln 工
  • 实时语音通讯技术的应用场景与挑战

    随着互联网和移动通信技术的快速发展 实时语音通讯技术已经成为人们日常生活和工作中不可或缺的一部分 实时语音通讯技术可以让人们通过网络进行实时语音通话 不受时间和地点的限制 带来了极大的便利和效率提升 本文将探讨实时语音通讯技术的应用场景和挑
  • Java并发之ThreadLocal源码分析(第二篇:添加元素)

    前言 两个与添加元素相关的方法 initialValue 用于初始化一个默认值 set 用于添加一个元素 set 方法分析 public void set T value Thread t Thread currentThread Thre
  • Pycharm运行unittest报错ModuleNotFoundError: No module named ‘pytest‘解决

    使用unittest未import pytest相关功能语句 在pycharm中右键run的时候报错 Traceback most recent call last File B Application pycharm PyCharm 20
  • FCK配置中文版(转自网络,未知来源)

    1 FCKConfig CustomConfigurationsPath 自定义配置文件路径和名称 2 FCKConfigFCKConfig EditorAreaCSS FCKConfig BasePath css fck editorar
  • MATLAB 图像平移操作(转)

    function outImage immove inImage Tx Ty m n size inImage Tx fix Tx Ty fix Ty move xif Tx lt 0 inImage imcrop inImage abs
  • Android 下拉选择框自定义view

    首先来看一下实现的效果 基本思路 继承PopupWindow的自定义View 说明 下图这部分自己布局 本文中主要说明的是点击某个分类显示的下拉实现 第一步 自定义 SpinnerPopuwindow继承PopupWindow Create