仿Ios下拉菜单,android Spinner效果(美团下拉效果)

这篇博客展示了如何在Android中实现类似iOS的Spinner下拉菜单效果,提供了详细的代码示例,包括布局文件和MainActivity的实现。在使用时需要注意初始化时传入Activity的上下文,并且获取选中项时的索引是从1开始的。此外,还提供了一个仿iOS下拉菜单选项的下载链接。

先上效果图:

 直接上代码:

Ios spinner文件

package com.choe.iosspinner;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import java.util.List;

/**
 * Created by choe on 2016/10/14.
 */
public class IosSpinner extends TextView {
    private OnSpinnerItemClickListener mOnSpinnerItemClickListener;
    private int currentSelectedItemPosition=1;
    private IosSpinnerAdapter iosAdapter;
    private List<String> datas;
    private PopupWindow mPopWindow;

    public IosSpinner(Context context) {
        super(context);
        initView((Activity) context);
    }

    public IosSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (context instanceof Activity){

            initView((Activity) context);
        }else {

        }
    }

    public IosSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView((Activity) context);
    }

    /**
     * 设置item 点击事件
     * @param listener
     */
    public void setOnSpinnerItemClickListener(OnSpinnerItemClickListener listener){
        this.mOnSpinnerItemClickListener=listener;
    }

    /**
     * 获取当前选中的item
     * @return
     */
    public int getSelectedItemPosition(){
        return currentSelectedItemPosition;
    }
    /**
     * 初始化下拉框
     * @param context
     */
    private void initView(Activity context) {
        Drawable drawable= getResources().getDrawable(R.mipmap.down2);
        /// 这一步必须要做,否则不会显示.
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
        setCompoundDrawables(null,null,drawable,null);
    }

    /**
     * 设置数据源
     * @param datas
     */
    private void setData(List<String> datas){
        this.datas=datas;
    }

    /**
     * 显示window
     */
  public void showWindow(){

      Drawable drawable= getResources().getDrawable(R.mipmap.color_up);
      /// 这一步必须要做,否则不会显示.
      drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
      setCompoundDrawables(null,null,drawable,null);
      mPopWindow.showAsDropDown(this);
  }

    /**
     * 初始化列表window
     * @param context 上下文 必须是activity
     * @param list  数据源
     */
    public void init( Activity context, List<String> list){
        setData(list);
        setGravity(Gravity.CENTER);
        setText(datas.get(0));
        View view = View.inflate(context, R.layout.popwindow, null);
        final ListView listView = (ListView) view.findViewById(R.id.pop_list);
        iosAdapter=new IosSpinnerAdapter(context);
        listView.setAdapter(iosAdapter);

         mPopWindow = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT,true);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                IosSpinner.this.setText(datas.get(position));
                currentSelectedItemPosition=position+1;
                iosAdapter.notifyDataSetChanged();
                mPopWindow.dismiss();
                if (mOnSpinnerItemClickListener!=null){
                    mOnSpinnerItemClickListener.OnSpinnerItemClick(parent,view,position,id);
                }
            }
        });

        mPopWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_transparent));
        mPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                Drawable drawable= getResources().getDrawable(R.mipmap.down2);
                /// 这一步必须要做,否则不会显示.
                drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
                setCompoundDrawables(null,null,drawable,null);

            }
        });
    }

    /**
     * 关闭当前的window
     */
    public void closeWindow(){
        if (mPopWindow!=null&&mPopWindow.isShowing()){

            mPopWindow.dismiss();
        }
    }


    class IosSpinnerAdapter extends BaseAdapter {
        private Context context;

        public IosSpinnerAdapter(Context context) {
            this.context = context;
        }

        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public Object getItem(int position) {
            return datas.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView==null){

                convertView = View.inflate(context, R.layout.item_pop, null);
            }
            View view=convertView.findViewById(R.id.divider);
            View up_divider=convertView.findViewById(R.id.up_divider);
            TextView textView= (TextView) convertView.findViewById(R.id.type);
            ImageView imageView= (ImageView) convertView.findViewById(R.id.isSelected);

            if (position==0){
                up_divider.setVisibility(View.VISIBLE);
            }
            if (position==datas.size()-1){
                view.setVisibility(View.GONE);
            }
            if (position==currentSelectedItemPosition-1){
                imageView.setVisibility(View.VISIBLE);
                textView.setTextColor(Color.parseColor("#99F47C30"));
            }else {
                imageView.setVisibility(View.GONE);
                textView.setTextColor(Color.parseColor("#99000000"));
            }
            textView.setText(datas.get(position));
            return convertView;
        }
    }


    public interface  OnSpinnerItemClickListener{
        void OnSpinnerItemClick(AdapterView<?> parent, View view, int position, long id);
    }
}


布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.choe.iosspinner.MainActivity">

    <FrameLayout
        android:background="#FFFFFF"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.choe.iosspinner.IosSpinner
            android:layout_marginRight="10dp"
            android:id="@+id/iosspinner"
            android:background="#FFFFFF"
            android:layout_width="match_parent"
            android:layout_height="40dp"/>
    </FrameLayout>
</RelativeLayout>


MainActivity 文件

 mIosSpinner= (IosSpinner)findViewById(R.id.iosspinner);
        items=new ArrayList<>();
        items.add("item1");
        items.add("item2");
        items.add("item3");
        mIosSpinner.init(MainActivity.this,items);
        currentSlectedItem=mIosSpinner.getSelectedItemPosition();
        mIosSpinner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { //本想是点击自动显示,不需要手动设置 但是会出现错误 没找到很好的解决方案 有办法的小伙伴告知一下
                mIosSpinner.showWindow();
            }
        });
        mIosSpinner.setOnSpinnerItemClickListener(new IosSpinner.OnSpinnerItemClickListener() {
            @Override
            public void OnSpinnerItemClick(AdapterView<?> parent, View view, int position, long id) {
                currentSlectedItem=mIosSpinner.getSelectedItemPosition();
                Log.e("当前选中item",""+currentSlectedItem);
                // TODO do someThing
            }
        });

使用时注意:

 在init方法时,传入activity的上下文。 其他也没什么,注释详细

获取选中的item时,获得的值是在list的position+1,位置不是从0开始


附下载地址:仿Ios下拉菜单选项

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值