通过popwindows 实现简单的选择器
主界面java代码
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//实现简单选择功能
public class MainActivity extends AppCompatActivity {
private List<String> countryDataList = new ArrayList<>();
private Button btSelectCountry;
private Button btSelectTime;
private PopupWindow mPopupWindow;
private void initCountryData() {
String[] stringArray = getResources().getStringArray(R.array.arr_choose_country_item_all);
countryDataList.addAll(Arrays.asList(stringArray));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initCountryData();
btSelectCountry = (Button) findViewById(R.id.bt_select_country);
btSelectTime = (Button) findViewById(R.id.bt_select_time);
btSelectCountry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectCountry(btSelectCountry);
}
});
btSelectTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectTime();
}
});
}
private void selectTime() {
}
private void selectCountry(View view) {
LinearLayout linearLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.window_popup, null);
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
int height = wm.getDefaultDisplay().getHeight();
mPopupWindow = new PopupWindow(linearLayout, ViewGroup.LayoutParams.MATCH_PARENT,
height / 2);//条目过少时,则设置为包裹内容高度
mPopupWindow.setFocusable(true);//点击空白处 取消
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
//弹入弹出动画
mPopupWindow.setAnimationStyle(R.style.Popupwindow);
int[] location = new int[2];
view.getLocationOnScreen(location);//控件在其整个屏幕上的坐标位置
mPopupWindow.showAtLocation(view, Gravity.LEFT | Gravity.BOTTOM, 0, -location[1]);
setButtonListeners(linearLayout);
}
private void setButtonListeners(LinearLayout linearLayout) {
RecyclerView recyclerView = (RecyclerView) linearLayout.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
HomeAdapter adapter = new HomeAdapter(this, countryDataList);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new HomeAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
btSelectCountry.setText(countryDataList.get(position));
mPopupWindow.dismiss();
}
@Override
public void onItemLongClick(View view, int position) {
}
});
}
}
PopupWindow对应的xml window_popup
<?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:background="#dadada"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:scrollbars="none" />
</LinearLayout>
主界面布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.hichina.administrator.pickerviewdemo.MainActivity">
<Button
android:id="@+id/bt_select_country"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:text="选择国家!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_select_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:text="选择时间!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
列表适配器 HomeAdapter
package com.hichina.administrator.pickerviewdemo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by Administrator on 2018/8/30.
*/
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
private Context context;
private List<String> mDatas;
public HomeAdapter(Context context, List<String> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
context).inflate(R.layout.window_popup_item, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.country.setText(mDatas.get(position));
// 如果设置了回调,则设置点击事件
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, pos);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemLongClick(holder.itemView, pos);
return false;
}
});
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView country;
public MyViewHolder(View view) {
super(view);
country = (TextView) view.findViewById(R.id.country);
}
}
//点击事件接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
}
适配器 xm
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="1dp"
android:background="#ffffff">
<TextView
android:id="@+id/country"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text=""
android:textColor="#333333"
android:textSize="15sp" />
</RelativeLayout>
style
<style name="Popupwindow">
<item name="android:windowEnterAnimation">@anim/window_out</item>
<item name="android:windowExitAnimation">@anim/window_back</item>
</style>
动画资源 window_out, window_back
out:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromYDelta="100%" android:toYDelta="0"
android:duration="300"/>
back:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromYDelta="0" android:toYDelta="100%"
android:duration="200"/>
国家列表数组 资源 部分
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arr_choose_country_item_all">
<item>ANDORRA 安道尔</item>
<item>UNITED ARAB EMIRATES 阿拉伯联合酋长国</item>
<item>AFGHANISTAN 阿富汗</item>
<item>ANTIGUA AND BARBUDA 安提瓜及巴布达</item>
<item>ANGUILLA 安圭拉岛</item>
<item>ALBANIA 阿尔巴尼亚</item>
<item>ARMENIA 亚美尼亚</item>
<item>NETHERLANDS ANTILLES 荷属安的列斯群岛</item>
<item>ANGOLA 安哥拉</item>
<item>ARGENTINA 阿根廷</item>
<item>AMERICAN SAMOA 美属萨摩亚群岛</item>
<item>AUSTRIA 奥地利</item>
<item>AUSTRALIA 澳大利亚</item>
<item>ARUBA 阿鲁巴岛</item>
<item>AZERBAIJAN 阿塞拜疆(独联体)</item>
<item>BOSNIA AND HERZEGOVINA 波斯尼亚-黑塞哥维那共和国</item>
<item>BARBADOS 巴巴多斯</item>
<item>BANGLADESH 孟加拉国</item>
<item>BELGIUM 比利时</item>
<item>BURKINA FASO 布基纳法索</item>
<item>BULGARIA 保加利亚</item>
<item>BAHRAIN 巴林</item>
<item>BURUNDI 布隆迪</item>
<item>BENIN 贝宁</item>
<item>BERMUDA 百慕大</item>
<item>BRUNEI 文莱</item>
<item>BOLIVIA 波利维亚</item>
<item>BRAZIL 巴西</item>
<item>BAHAMAS 巴哈马</item>
<item>BHUTAN 不丹</item>
<item>BOUVET ISLAND 布维岛</item>
<item>BOTSWANA 博茨瓦纳</item>
<item>BELARUS 白俄罗斯(独联体)</item>
<item>BELIZE 伯利兹</item>
<item>CANADA 加拿大</item>
<item>COCOS(KEELING)ISLANDS 科科斯群岛</item>
<item>CONGO REPUBLIC 刚果民主共和国</item>
<item>CENTRAL REPUBLIC 中非共和国</item>
<item>CONGO 刚果</item>
<item>SWITZERLAND 瑞士</item>
<item>COTE D-LVOIRE(IVORY) 科特迪瓦(象牙海岸) </item>
<item>COOK ISLANDS 库克群岛</item>
<item>CHILE 智利</item>
<item>CAMEROON 喀麦隆</item>
<item>CHINA 中国</item>
<item>COLOMBIA 哥伦比亚</item>
<item>COSTA RICA 哥斯达黎加</item>
<item>CUBA 古巴</item>
<item>CAPE VERDE 佛得角群岛</item>
<item>CHRISTMAS ISLAND 圣诞岛</item>
<item>CYPRUS 塞浦路斯</item>
<item>CZECH REPUBLIC 捷克共和国</item>
<item>GERMANY 德国</item>
<item>DJIBOUTI 吉布提</item>
<item>DENMARK 丹麦</item>
<item>DOMINICA 多米尼克</item>
<item>DOMINICAN REPUBLIC 多米尼加共合国</item>
<item>ALGERIA 阿尔及利亚</item>
<item>ECUADOR 厄瓜多尔</item>
<item>ESTONIA 爱沙尼亚</item>
<item>EGYPT 埃及</item>
<item>WESTERN SAHARA 西撒哈拉</item>
<item>ERITREA 厄里特立亚</item>
<item>SPAIN 西班牙</item>
<item>ETHIOPIA 埃塞俄比亚</item>
<item>FINLAND 芬兰</item>
<item>FIJI 斐济</item>
<item>FALKLAND ISLAND 福克兰群岛</item>
<item>MICRONESIA 密克罗尼西亚</item>
<item>FAROE ISLANDS 法鲁群岛</item>
<item>FRANCE 法国</item>
<item>FRANCE, METROPOLITAN 法属美特罗波利坦</item>
<item>GABON 加蓬</item>
<item>UNITED KINGDOM 英国</item>
<item>GRENADA 格林纳达</item>
<item>GEORGIA 格鲁吉亚</item>
<item>FRENCH GUIANA 法属圭亚那</item>
<item>GUERNSEY 根西岛</item>
<item>GHANA 加纳</item>
<item>GIBRALTAR 直布罗陀</item>
<item>GREENLAND 格陵兰</item>
<item>GAMBIA 冈比亚</item>
<item>GUINEA 几内亚</item>
<item>GUADELOUPE 瓜德罗普</item>
<item>EQUATORIAL GUINEA 赤道几内亚</item>
<item>GREECE 希腊</item>
<item>SOUTH GEORGIA AND THE SOUTH SANDWICH ISL 南乔治亚岛和南桑威奇群岛</item>
<item>GUATEMALA 危地马拉</item>
<item>GUAM 关岛</item>
<item>GUINEA BISSAU 几内亚比绍</item>
<item>GUYANA (BRITISH) 圭亚那</item>
<item>HONG KONG 香港</item>
<item>HEARD ISLAND AND MCDONALD ISLANDS 赫德岛和麦克唐纳岛</item>
<item>HONDURAS 洪都拉斯</item>
<item>CROATIA 克罗地亚</item>
<item>HAITI 海地</item>
<item>HUNGARY 匈牙利</item>
<item>CANARY ISLANDS 加那利群岛</item>
<item>INDONESIA 印度尼西亚</item>
<item>IRELAND 爱尔兰</item>
<item>ISRAEL 以色列</item>
<item>INDIA 印度</item>
<item>BRITISH INDIAN OCEAN TERRITORY 英属印度洋地区</item>
<item>IRAQ 伊拉克</item>
<item>IRAN (ISLAMIC REPUBLIC OF) 伊朗</item>
<item>ICELAND 冰岛</item>
<item>ITALY 意大利</item>
<item>JERSEY 泽西岛(英属)</item>
<item>JAMAICA 牙买加</item>
<item>JORDAN 约旦</item>
<item>JAPAN 日本</item>
<item>KENYA 肯尼亚</item>
<item>KYRGYZSTAN 吉尔吉斯斯坦</item>
<item>CAMBODIA 柬埔寨</item>
<item>KIRIBATI REPUBILC 基利巴斯共和国</item>
<item>COMOROS 科摩罗</item>
<item>SAINT KITTS 圣基茨</item>
<item>NORTH KOREA 朝鲜</item>
<item>SOUTH KOREA 韩国</item>
<item>KOSOVO 科索沃</item>
<item>KUWAIT 科威特</item>
<item>CAYMAN ISLANDS 开曼群岛</item>
<item>KAZAKHSTAN 哈萨克斯坦</item>
<item>LAOS 老挝</item>
<item>LEBANON 黎巴嫩</item>
<item>ST. LUCIA 圣卢西亚</item>
<item>LIECHTENSTEIN 列支敦士登</item>
<item>SRI LANKA 斯里兰卡</item>
<item>LIBERIA 利比里亚</item>
<item>LESOTHO 莱索托</item>
<item>LITHUANIA 立陶宛</item>
<item>LUXEMBOURG 卢森堡</item>
<item>LATVIA 拉脱维亚</item>
<item>LIBYA 利比亚</item>
<item>MOROCCO 摩洛哥</item>
<item>MONACO 摩纳哥</item>
<item>MOLDOVA 摩尔多瓦</item>
<item>MONTENEGRO 黑山共和国</item>
<item>MADAGASCAR 马达加斯加</item>
<item>MARSHALL ISLANDS 马绍尔群岛</item>
<item>MACEDONIA 马其顿</item>
<item>MALI 马里</item>
<item>MYANMAR 缅甸</item>
<item>MONGOLIA 蒙古</item>
<item>MACAU 澳门</item>
<item>SAIPAN 塞班岛</item>
<item>MARTINIQUE 马提尼克岛</item>
<item>MAURITANIA 毛里塔尼亚</item>
<item>MONTSERRAT 蒙特塞拉岛</item>
<item>MALTA 马尔他</item>
<item>MAURITIUS 毛里求斯</item>
<item>MALDIVES 马尔代夫</item>
<item>MALAWI 马拉维</item>
<item>MEXICO 墨西哥</item>
<item>MALAYSIA 马来西亚</item>
<item>MOZAMBIQUE 莫桑比克</item>
<item>NAMIBIA 纳米比亚</item>
<item>NEW CALEDONIA 新喀里多尼亚</item>
<item>NIGER 尼日尔</item>
<item>NORFOLK ISLAND 诺褔克岛</item>
<item>NIGERIA 尼日利亚</item>
<item>NICARAGUA 尼加拉瓜</item>
<item>NETHERLANDS 荷兰</item>
<item>NORWAY 挪威</item>
<item>NEPAL 尼泊尔</item>
<item>NAURU REPUBLIC 瑙鲁共和国</item>
<item>NIUE 纽埃岛</item>
<item>NEW ZEALAND 新西兰</item>
<item>OMAN 阿曼</item>
<item>PANAMA 巴拿马</item>
<item>PERU 秘鲁</item>
<item>FRENCH POLYNESIA 塔希堤岛(法属波利尼西亚)</item>
<item>PAPUA NEW GUINEA 巴布亚新几内亚</item>
<item>PHILIPPINES 菲律宾</item>
<item>PAKISTAN 巴基斯坦</item>
<item>POLAND 波兰</item>
<item>SAINT PIERRE AND MIQUELON 圣皮埃尔和密克隆群岛</item>
<item>PITCAIRN ISLANDS 皮特凯恩群岛</item>
<item>PUERTO RICO 波多黎各</item>
<item>PORTUGAL 葡萄牙</item>
<item>PALAU 帕劳</item>
<item>PARAGUAY 巴拉圭</item>
<item>QATAR 卡塔尔</item>
<item>REUNION ISLAND 留尼汪岛</item>
<item>ROMANIA 罗马尼亚</item>
<item>SERBIA, REPUBLIC OF 塞尔维亚共和国</item>
<item>RUSSIA 俄罗斯</item>
<item>RWANDA 卢旺达</item>
<item>SAUDI ARABIA 沙特阿拉伯</item>
<item>SOLOMON ISLANDS 所罗门群岛</item>
<item>SEYCHELLES 塞舌尔</item>
<item>SUDAN 苏丹</item>
<item>SWEDEN 瑞典</item>
<item>SINGAPORE 新加坡</item>
<item>ST HELENA 圣赫勒拿岛</item>
<item>SLOVENIA 斯洛文尼亚</item>
<item>SVALBARD AND JAN MAYEN 斯瓦尔巴岛和扬马延岛</item>
<item>SLOVAKIA REPUBLIC 斯洛伐克共和国</item>
<item>SIERRA LEONE 塞拉里昂</item>
<item>SAN MARINO 圣马力诺</item>
<item>SENEGAL 塞内加尔</item>
<item>SOMALIA 索马里</item>
<item>SURINAME 苏里南</item>
<item>SAO TOME AND PRINCIPE 圣多美和普林西比</item>
<item>EL SALVADOR 萨尔瓦多</item>
<item>SYRIA 叙利亚</item>
<item>SWAZILAND 斯威士兰</item>
<item>TRISTAN DA CUNBA 特里斯坦</item>
<item>TURKS AND CAICOS ISLANDS 特克斯和凯科斯群岛</item>
<item>CHAD 乍得</item>
<item>FRENCH SOUTHERN TERRITORIES 法属南部领土</item>
<item>TOGO 多哥</item>
<item>THAILAND 泰国</item>
<item>TAJIKISTAN 塔吉克斯坦</item>
<item>TOKELAU 托克劳</item>
<item>EAST TIMOR 东帝汶</item>
<item>TURKMENISTAN 土库曼斯坦</item>
<item>TUNISIA 突尼斯</item>
<item>TONGA 汤加</item>
<item>TURKEY 土耳其</item>
<item>TRINIDAD AND TOBAGO 特立尼达和多巴哥</item>
<item>TUVALU 图瓦卢</item>
<item>TAIWAN 台湾</item>
<item>TANZANIA 坦桑尼亚</item>
<item>UKRAINE 乌克兰</item>
<item>UGANDA 乌干达</item>
<item>GLOBAL 全球</item>
<item>UNITED STATES MINOR OUTLYING ISLANDS 美国本土外小岛屿</item>
<item>UNITED STATES 美国</item>
<item>URUGUAY 乌拉圭</item>
<item>UZBEKISTAN 乌兹别克斯坦</item>
</string-array>
</resources>