文档章节

使用RelativeLayout实现自定义下拉列表Spinner

After_You
 After_You
发布于 2015/10/22 21:26
字数 1073
阅读 38
收藏 0
点赞 0
评论 0

Android有提供Spinner,但并不是什么时候都可以满足需求。我们可以通过ReLativeLayout+TextView+ImageView来实现我们自己的一个Spinner,可以完成一些复杂的功能,而且更灵活。

现在进入正题: 先来看一下效果 效果图

下面开始具体的实现,作为一个demo,我只写一些核心的代码 首先我们把XML文件先写好。定义一个ListView作为我们显示的下拉列表。我们建一个XML,叫myspinner_list.xml,里面只需放一个ListView即可。 myspinner_list.xml

<?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="match_parent"
    android:orientation="vertical" 
    android:background="#ffffffff">
        <ListView 
            android:id="@+id/lv_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff"
            android:divider="#ffffff"
            android:dividerHeight="0dp"/>
</LinearLayout>

有了ListView,那我们还需要写ListView里面的Item的XML文件,新建myspinner_list_item.xml,我们的demo比较简单里面就一个TextView。 myspinner_list_item.xml

<TextView
    android:id="@+id/tv_text"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:layout_gravity="center_vertical"
    android:text="item"
    android:padding="10dp"
    android:textSize="17sp"
    android:background="#ffffff"/>

最后在actitity_main.xml,写好我们的下拉列表的样式,具体的样式就根据项目要求去写就好了。 actitity_main.xml


<RelativeLayout
    android:id="@+id/rl_spinner"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:background="@drawable/relayout_spinner_bg">

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:textSize="18sp"
        android:singleLine="true"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/invert_triangle"/>
</RelativeLayout>

到这里我们XML文件就都写好了,我们开始java代码的编写

首先我们需要写一个适配器,我们定义为SpinnerListAdapter.java,继承BaseAdapter 适配器的作用主要是给list_item进行赋值 SpinnerListAdapter.java

public class SpinnerListAdapter extends BaseAdapter {

    private int mPosition;
    private String[] mItems;
    private MySpinner mSpinner;
    private Activity mActivity;
    private onItemClickListener mListener;

    public SpinnerListAdapter(MySpinner spinner, Activity activity, String[] items){
        this.mActivity=activity;
        this.mItems=items;
        this.mSpinner =spinner;
    }

    public int getCount() {
        return mItems.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    private class ViewHolder {
        public TextView text;
    }

    public View getView(final int arg0, final View arg1, ViewGroup arg2) {
        //获取设置好的listener
        mListener= mSpinner.getListener();
        View view=arg1;
        ViewHolder holder=null;
        if(view==null){
            view= View.inflate(mActivity, R.layout.myspinner_list_item, null);
            holder = new ViewHolder();
            holder.text=(TextView) view.findViewById(R.id.tv_text);
            view.setTag(holder);
        }else {
            holder = (ViewHolder) view.getTag();
        }
        holder.text.setText(mItems[arg0]);

        view.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mPosition=arg0; 
                mSpinner.close();
                mListener.click(mPosition,arg1);
            }
        });
        return view;
    }

    //回调接口
    public interface onItemClickListener{
        public void click(int position, View view);
    }   
}

然后来到我们最重要的一个类,我们定义为MySpinner.java,继承PopupWindow,PopupWindow其实也是对话框,与AlertDialog不一样的是PopupWindow在界面任何地方显示,像悬浮窗体,具体自行Google,我就不啰嗦了。 MySpinner.java

public class MySpinner extends PopupWindow implements OnItemClickListener {

    private String[] mItems;
    private MySpinner mWindow;
    private SpinnerListAdapter.onItemClickListener mListener;

    public MySpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MySpinner(Activity activity, int width, String[] items){
        LayoutInflater inflater=activity.getLayoutInflater();
        View contentView=inflater.inflate(R.layout.myspinner_list, null);
        // 设置PopupWindow的View 
        this.setContentView(contentView);
        // 设置PopupWindow弹出窗体的宽
        this.setWidth(width);
        // 设置PopupWindow弹出窗体的高  
        this.setHeight(android.view.WindowManager.LayoutParams.WRAP_CONTENT);  
        this.setFocusable(true);  
        this.setOutsideTouchable(true);  
        // 刷新状态  
        this.update();   
        // 实例化一个ColorDrawable颜色
        ColorDrawable dw = new ColorDrawable(0xffffffff);
        this.setBackgroundDrawable(dw);

        this.mItems=items;
        ListView listView=(ListView) contentView.findViewById(R.id.lv_list);
        mWindow=this;
        SpinnerListAdapter adapter=new SpinnerListAdapter(mWindow,activity, mItems);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(this);
    }

    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        MySpinner.this.dismiss();
    }

    public void showAtLocation(View parent, int gravity, int x, int y) {
        super.showAtLocation(parent, gravity, x, y);
    }

    public void close(){
        this.dismiss();
    }

    public int position(){
        return 0;   
    }

    public void setOnItemClickListener(SpinnerListAdapter.onItemClickListener listener){
        this.mListener=listener;
    }

    public SpinnerListAdapter.onItemClickListener getListener(){
        //可以通过this的实例来获取设置好的listener
        return mListener;       
    }
}

其实也没多少东西,上面也有相应的注释。

准备工作已经做完了,我们来调用上面的方法,实现我们的目的 我们在MainActivity进行调用,我们需要监听rl_spinner的点击事件,设置显示的数据源,当选择item时,将数据源的值赋给tv_conten进行显示。 MainActivity .java

public class MainActivity extends AppCompatActivity {

    private RelativeLayout rl_spinner;
    private TextView tv_content;
    private String array[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rl_spinner = (RelativeLayout) findViewById(R.id.rl_spinner);
        tv_content = (TextView) findViewById(R.id.tv_content);

        //初始化
        array = new String[]{"item1", "item2", "item3", "item4", "item5", "item6"};
        tv_content.setText(array[0]);

        rl_spinner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MySpinner mySpinner = new MySpinner(MainActivity.this, rl_spinner.getWidth(), array);
                mySpinner.showAsDropDown(rl_spinner, 0, 0);//显示在rl_spinner的下方
                mySpinner.setOnItemClickListener(new SpinnerListAdapter.onItemClickListener() {
                    @Override
                    public void click(int position, View view) {
                        tv_content.setText(array[position]);
                    }
                });
            }
        });

    }
}

这里是作为一个简单demo,通过这种方法我们可以实现更多更丰富的功能,比如在ListView里可以显示图片,比Spinner会更灵活一点,更多的用法可以自己进行研究。

最后附上源码 源码

© 著作权归作者所有

共有 人打赏支持
After_You
粉丝 0
博文 1
码字总数 1073
作品 0
珠海
程序员
【Android笔记】Spinner

一、使用步骤 第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项 第二步:为下拉列表定义一个数组适配器(ArrayAdapter) 第三步:为适配器设置下拉列表下拉时的菜单样式...

大道无名 ⋅ 2016/09/28 ⋅ 0

android UI那点事

1,不要照搬其他平台的UI布局,应该让用户感觉是在真正的使用一个Android 软件。 2,不要使用固定的绝对定位布局。 3,不要是使用PX单位,使用dp或者为文本使用sp 不能使用太小字体 4,不要过...

dominic69 ⋅ 2015/12/27 ⋅ 0

通过Spinner视图实现二级联动功能(省市)转

1.确定我需要的数据放到res/values/arrays.xml文件(定义数组) <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="province"> <item>-省份-</item> <item>河北省</ite......

哈全文 ⋅ 2012/04/17 ⋅ 1

Android Spinner 五步走

自定义Spinner(下拉列表)五步走,原文出处:http://yilee.info/android-spinner.html 在Android的UI开发中,Spinner(下拉列表)总是可以用到的,一个简单的自定义Spinner制作我们只需要记住这...

鉴客 ⋅ 2011/12/01 ⋅ 2

【android基础学习之四】——基础控件CheckBox,Spinner,AutoCompleteTextView,DatePicker,TimePicker

声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误...

晨曦之光 ⋅ 2012/03/08 ⋅ 0

Android中的下拉列表-自定义选项界面样式

Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());获取下拉列表框的值 调用setOnItemSelectedListener()方法,处理下拉列表框被选择事件,把AdapterView.OnItemSelectedListe......

一念三千 ⋅ 2012/08/27 ⋅ 0

android自定义spinner,使用AppCompatTextView+PopupWindow 实现下拉选择的功能

自定义spinner 自定义spinner,使用AppCompatTextView+PopupWindow 实现下拉选择的功能,代码简单,几个类 感谢 https://github.com/arcadefire/nice-spinner,本项目是对其的优化与扩展 1、...

陶海理 ⋅ 01/16 ⋅ 0

Spinner:列表选择框

一、概述 Android的Spinner并不需要显示下拉列表,而是相当于弹出一个菜单供用户选择。 Spinner是ViewGroup的间接子类,因此它也可以作为容器使用。 Spinner支持的XML属性: android:prompt...

Xushao ⋅ 2012/10/09 ⋅ 0

Android 之 下拉框(Spinner)的使用

下拉列表 Spinner。 Spinner的使用,可以极大提高用户的体验性。当需要用户选择的时候,可以提供一个下拉列表将所有可选的项列出来。供用户选择。 Demo如下,可以留作参考 一、使用数组作为数...

鉴客 ⋅ 2011/12/01 ⋅ 16

自定义下拉菜单模式Spinner

Spinner 下拉菜单 setDropDownViewResource xml方式定义下拉列表菜单要显示的模样,类似于填充器 package com.example.demo; import java.util.ResourceBundle.Control; import android.os.B......

chenruibing ⋅ 2015/05/29 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 11分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 15分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 20分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 21分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 31分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 53分钟前 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 56分钟前 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 59分钟前 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部