下拉列表在android中自带spinner的有时候不太适合我们的界面,我们希望有自己的一种显示方法,那怎么办?自定义Spinner.效果如QQ账号选择一样。如图所以。


这种效果,如果你喜欢,你可以往下接着看。

这里我们使用listView配合TextView实现的。

1 布局文件                                                     

activity_main.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent" > <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:gravity="clip_vertical" > <LinearLayout
android:id="@+id/spinnerid"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="10dp"
android:background="@drawable/preference_single_item"
android:gravity="right" > <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="1234"
android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/mm_submenu_dropdown" /> </LinearLayout>
</RelativeLayout> </LinearLayout>

myspinner_dropdown.xml这里面只有一个listView

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@null"
android:dividerHeight="1px"></ListView>
</LinearLayout>

myspinner_dropdown_item.xml这里就是每个item布局

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:id="@+id/myspinner_dropdown_layout"
android:layout_width="fill_parent"
android:layout_height="35dp"
android:background="@drawable/preference_item"
android:gravity="left|center" >
<TextView
android:id="@+id/myspinner_dropdown_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="TextView"
android:textSize="20sp" />
</RelativeLayout>
</LinearLayout>

2程序代码实现

MyspinnerAdapter.java文件是listview的适配文件

package com.example.testspinner2;

import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView; public class MyspinnerAdapter extends BaseAdapter {
LayoutInflater inflater;
Context context;
ArrayList<String> list; public MyspinnerAdapter(Context context, ArrayList<String> list) {
super();
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
} @Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.myspinner_dropdown_items, null);
viewHolder = new ViewHolder();
viewHolder.layout = (RelativeLayout) convertView.findViewById(R.id.myspinner_dropdown_layout);
viewHolder.textView = (TextView) convertView.findViewById(R.id.myspinner_dropdown_txt);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if(list.size() == position+1){
viewHolder.layout.setBackgroundResource(R.drawable.preference_last_item);
}else{
viewHolder.layout.setBackgroundResource(R.drawable.preference_item);
}
viewHolder.textView.setText(list.get(position));
return convertView;
} public class ViewHolder {
RelativeLayout layout;
TextView textView;
} public void refresh(List<String> l) {
this.list.clear();
list.addAll(l);
notifyDataSetChanged();
} public void add(String str) {
list.add(str);
notifyDataSetChanged();
} public void add(ArrayList<String> str) {
list.addAll(str);
notifyDataSetChanged(); }
}

这里面比较关键的是判断当前item是否为最后一个item,如果是最后一个背景需要更改,毕竟中间的背景和最后一项item是不同的

MainActivity.java

package com.example.testspinner2;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView; public class MainActivity extends Activity {
private ArrayList<String> list;
private ImageView imgView;
private TextView textView;
private LinearLayout layout;
private ListView listView;
private MyspinnerAdapter adapter;
private PopupWindow popupWindow;
private LinearLayout spinnerlayout;
int width; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView2);
imgView = (ImageView) findViewById(R.id.imageView1);
// 实例化一个List,添加数据
list = new ArrayList<String>();
list.add("第一展厅");
list.add("4展厅");
list.add("第三展厅");
adapter = new MyspinnerAdapter(this, list);
textView.setText((CharSequence) adapter.getItem(0));
spinnerlayout = (LinearLayout) findViewById(R.id.spinnerid);
// 点击右侧按钮,弹出下拉框
imgView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { if(list.size()>0){
spinnerlayout.setBackgroundResource(R.drawable.preference_first_item);
}
showWindow(spinnerlayout, textView); }
});
}
protected void onResume(){
super.onResume(); }
public void showWindow(View position, final TextView txt) { layout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.mypinner_dropdown, null);
listView = (ListView) layout.findViewById(R.id.listView);
listView.setAdapter(adapter);
popupWindow = new PopupWindow(position);
// 设置弹框的宽度为布局文件的宽
popupWindow.setWidth(spinnerlayout.getWidth());
popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
// 设置一个透明的背景,不然无法实现点击弹框外,弹框消失
popupWindow.setBackgroundDrawable(new BitmapDrawable());
// 设置点击弹框外部,弹框消失
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
popupWindow.setContentView(layout);
// 设置弹框出现的位置,在v的正下方横轴偏移textview的宽度,为了对齐~纵轴不偏移
popupWindow.showAsDropDown(position, 0, 0);
popupWindow.setOnDismissListener(new OnDismissListener(){
@Override
public void onDismiss() {
// TODO Auto-generated method stub
spinnerlayout.setBackgroundResource(R.drawable.preference_single_item);
} });
// listView的item点击事件
listView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
txt.setText(list.get(arg2));// 设置所选的item作为下拉框的标题
// 弹框消失
popupWindow.dismiss();
popupWindow = null;
}
}); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

这里前段和我们常用的没什么区别,只是监听imageView,关键的是showWindows做出了点击更多按钮弹出已存信息。在popupWindow消失的时候,背景变回没有弹出下拉菜单的背景样式。

可能大家没有图片资源,今天我传不上去,可以留下邮箱!


     

spinner自定义,效果如腾讯QQ账号选择时候的下拉列表的更多相关文章

  1. jQuery插件实现图片展开效果,jquery.gallery。仿腾讯QQ空间说说图片展示效果。

    公司的项目http://www.umfun.com/,有个说说的页面(和腾讯QQ空间说说一样),里面有个发表图片功能,上传完图片,需要点击展开的效果. 当时手里面事情比较多(公司就我一个前端),忙不过 ...

  2. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

  3. 高仿腾讯QQ即时通讯IM项目

    前言:其实这个项目早就开发完成了,在本人的github上,本来没打算写成博客的形式,因为一个项目要写出来要花很久,但是最近看到很多 人在我的github上download后随意发布到网上,本来上传到g ...

  4. 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……

    腾讯QQ团队将于12月4日开源一个服务开发运营框架,叫做毫秒服务引擎(Mass Service Engine in Cluster,MSEC),它集RPC.名字发现服务.负载均衡.业务监控.灰度发布. ...

  5. 腾讯QQ快捷登陆

    腾讯QQ快捷 相关各语言对接qq快捷登录教程 [C#]QQ开放平台(QQ站外登录)_流程和源码示例 j2ee中实现QQ第三方登陆 web实现QQ第三方登录 asp.net网站接入QQ登录 php实现q ...

  6. 仿腾讯QQ竖直滑动导航菜单

    菜单就像qq软件的分组,鼠标经过自动显示相应组的内容. 效果体验网址:http://keleyi.com/a/bjad/nf86w2dv.htm 以下是源代码: <html> <he ...

  7. 腾讯QQ会员技术团队:以手机QQ会员H5加速为例,为你揭开sonic技术内幕

    目前移动端越多越多的网页开始H5化,一方面可以减少安装包体积,另一方面也方便运营.但是相对于原生界面而言,H5的慢速问题一定被大家所诟病,针对这个问题,目前手Q存在几种方案,最常见的便是离线包方案,但 ...

  8. 高仿腾讯QQ最终版

    之前写过一篇关于高仿腾讯QQ的博客,不知道的看这:http://blog.csdn.net/htq__/article/details/51840273 ,主要是从界面上高仿了腾讯QQ,在UI上基本上 ...

  9. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...

随机推荐

  1. centos安装更新Python2.7以及pip的安装

    一.首先对相关的软件进行更新 python -V yum -y update yum groupinstall -y development yum install -y zlib zlib-dev ...

  2. Linux下安装PHP环境(非集成)

    一.安装Apache1.到官网下载  http://httpd.apache.org/download.cgi    2.安装apache [root@localhost 52lamp]# mkdir ...

  3. 【机器学习】k-近邻算法以及算法实例

    机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 -- ...

  4. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  5. linux下c获取时间

    头文件 #include "sys/time.h" 结构体 struct timezone { int tz_minuteswest; /*格林威治时间往西方的时差*/ int t ...

  6. 基于BeanNameViewResolver解析器,自定义视图

    概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 ...

  7. 【webssh】shellinabox搭建

    shellinabox搭建 centos环境安装命令 # yum install epel-release # yum install shellinabox 启动与关闭: service shell ...

  8. Sass和Compass的安装

    Sass和Compass都是基于Ruby编程语言的命令行工具.要使用它们,你首先需要在电脑中安装Ruby,并对电脑的命令行操作有一个基本的理解.Sass和Compass可以安装在Windows.Mac ...

  9. EasyUI学习总结(四)——parser源码分析(转载)

    本文转载自:http://www.cnblogs.com/xdp-gacl/p/4082561.html parser模块是easyloader第一个加载的模块,它的主要作用,就是扫描页面上easyu ...

  10. 洛谷P1113 杂务

    题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为 ...