============问题描述============
第一次发帖,主要是我今天为了实现一个好看点的下拉列表,在网上找了一天关于Spinner的资料,没有看到好的帖子。尝试了各种方法,始终找不到如何去设置下拉框的背景的方法,如果有请给我留言,谢谢。
最后在伟大的钟老师的建议下,我决定换个方向去考虑使用他说的PopupWindow,所以才找到一把写下拉列表的利剑,所以迫不及待的想把这个分享给那些和我一样迷失过小伙伴们。
该事例,实现了popupWindow 可以点击外部区域,取消视图的功能。
android:targetSdkVersion="19" />
先给大家看看效果图,很简单
用到的图片:
此处按钮图片里面的箭头我做在一起了,如果你不喜欢,想箭头按钮单独成为按钮,可以更改主页面里面的布局文件,TextView 后面加个Button,再设置背景就好了。想想Spinner能这样么?简直不想吐槽了。
就好了。
代码:Activity部分
PopWindowSpinnerActivity.java
package com.example.spinnertest;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
/**
* 这是一个用PopWindow 实现的下拉列表,对比spinner,我发现spinner,简直没用。
* @author lishuai
*
*/
public class PopWindowSpinnerActivity extends Activity {
//下拉按钮
TextView MyButton;
//PopupWindow对象声明
PopupWindow pw;
ArrayList list;
//当前选中的列表项位置
int clickPsition = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pop_window);
MyButton = (TextView) findViewById(R.id.myButton);
//获得要显示的数据
list = getList();
//设置默认显示的Text
MyButton.setText(list.get(0));
MyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过布局注入器,注入布局给View对象
View myView = getLayoutInflater().inflate(R.layout.pop, null);
//通过view 和宽·高,构造PopopWindow
pw = new PopupWindow(myView, 240, 300, true);
pw.setBackgroundDrawable(getResources().getDrawable(
//此处为popwindow 设置背景,同事做到点击外部区域,popwindow消失
R.drawable.diaolog_bg));
//设置焦点为可点击
pw.setFocusable(true);//可以试试设为false的结果
//将window视图显示在myButton下面
pw.showAsDropDown(MyButton);
ListView lv = (ListView) myView.findViewById(R.id.lv_pop);
lv.setAdapter(new ListViewAdapter(PopWindowSpinnerActivity.this, list));
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
MyButton.setText(list.get(position));
if (clickPsition != position) {
clickPsition = position;
}
pw.dismiss();
}
});
}
});
}
/**
* 得到list集合的方法
* @return
*/
public ArrayList getList() {
ArrayList list = new ArrayList();
list.add("每日吐槽");
list.add("灵感笔记");
list.add("爆笑王文");
list.add("内涵段子");
list.add("每日吐槽");
list.add("灵感笔记");
list.add("爆笑王文");
list.add("内涵段子");
list.add("每日吐槽");
list.add("灵感笔记");
list.add("爆笑王文");
list.add("内涵段子");
return list;
}
}
接下来是适配器:这个也算是小小优化了下。
ListViewAdapter.java
package com.example.spinnertest;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
* 适配器
* @author Administrator
*
*/
public class ListViewAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ArrayList list;
public ListViewAdapter(Context context, ArrayList list) {
super();
this.inflater = LayoutInflater.from(context);
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.lv_items, null);
}
TextView tv = (TextView)convertView.findViewById(R.id.text);
tv.setText(list.get(position));
return convertView;
}
}
接下来是drawable文件夹里面的点击效果selector:selector_sinner.xml
然后是几个xml文件:
文件名:activity_pop_window.xml
文件名:lv_items.xml
文件名:pop.xml
学了一年Android了,今天第一次使用popupwindow,在发现原来它这么强大。实在惭愧......不废话了。
大家加油。
============解决方案1============
这么专业的代码,你肯定是李帅!
============解决方案2============
这么牛B的想法,肯定是老钟教出来的
============解决方案3============
这么专业的代码,你还是李帅!
============解决方案4============
这么牛逼!一看就是卓新思创的!