通过popwindows 实现简单的选择器

通过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>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,417评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,727评论 0 17
  • 谁都有心情不好的时候 心情不好的时候要么沉默 要么发脾气 而我 正准备发脾气的时候 我选择了沉默 这是因为 我已经...
    千禧DAER阅读 663评论 0 1
  • 我和爸爸的关系不好,原因就是我和他的性格太像了,好听点是内向,不好听就是闷骚,我们有时候会无缘无故生气,然后不爱搭...
    绯城阅读 3,269评论 0 0
  • 十年前你是谁,一年前你是谁,甚至昨天你是谁,都不重要。重要的是,今天你是谁? 人生是很累的,你现在不累,以...
    钢泽阅读 1,280评论 0 1