安卓自定义下拉框---Spinner的实现

来源:互联网 发布:迅捷路由器软件下载 编辑:程序博客网 时间:2024/04/25 20:13

最近项目中用到下拉列表,刚开始一头雾水,后来在网上找了一个Demo,自己修改了一下,现在把它分享出来,给大家参考,写的不好,多多关照!不过功能还是实现的了······先上图给大家看看效果!


效果图:


实现思路:

1.定义下拉控件布局(ListView及子控件布局)

2.自定义SpinerPopWindow类

3.定义填充数据的Adapter

一、定义控件布局:

1.  activity_main.xml

<?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="match_parent"    android:background="#f2f2f2"    android:orientation="vertical"    android:padding="5dp" >    <LinearLayout        android:id="@+id/layout"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="5dp"        android:background="@drawable/bg_linearlayout"        android:orientation="vertical"        android:padding="0.2px" >        <RelativeLayout            android:id="@+id/relativelayout"            android:padding="2dp"            android:onClick="onClick"            android:layout_width="wrap_content"            android:layout_height="42dp" >            <TextView                android:id="@+id/tv_value"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:layout_centerVertical="true"                android:layout_marginRight="50dp"                android:background="#fff"                android:ellipsize="end"                android:gravity="left|center"                android:hint="请选择"                android:paddingLeft="10dp"                android:singleLine="true"                android:textColor="#ff000000"                android:textSize="18sp" >            </TextView>            <LinearLayout                android:id="@+id/bt_dropdown"                android:layout_width="50dp"                android:layout_height="match_parent"                android:layout_alignParentRight="true"                android:background="#fff"                android:gravity="center"                >                <ImageView                    android:layout_width="20dp"                    android:layout_height="20dp"                    android:background="@drawable/arrow_down" />            </LinearLayout>        </RelativeLayout>    </LinearLayout></RelativeLayout>
2. spiner_window_layout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:layout_alignParentRight="true"    android:background="#ffffff"    android:orientation="vertical">    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@drawable/bg_linearlayout"        android:cacheColorHint="#00000000"        android:scrollbars="none"></ListView></LinearLayout>

3. spiner_item_layout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:background="#00000000"    android:gravity="center_vertical"    android:minHeight="40dp">    <TextView        android:id="@+id/textView"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#00000000"        android:gravity="center"        android:textColor="@color/black"        android:textSize="18sp" /></LinearLayout>

二、定义SpinerPopWindow类

  SpinerPopWindow.java 类

package com.hykjsjkj.customspiner;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.PopupWindow;import java.util.List;/** * Copyright: Copyright (c) 2017-2025 * Company: * * @author: 赵小贱 * @date: 2017/8/23 * describe: */public class SpinerPopWindow extends PopupWindow implements OnItemClickListener {    private Context mContext;    private ListView mListView;    private SpinerAdapter mAdapter;    private SpinerAdapter.IOnItemSelectListener mItemSelectListener;        public SpinerPopWindow(Context context) {        super(context);        mContext = context;        init();    }        public void setItemListener(SpinerAdapter.IOnItemSelectListener listener) {        mItemSelectListener = listener;    }    public void setAdatper(SpinerAdapter adapter) {        mAdapter = adapter;        mListView.setAdapter(mAdapter);    }    private void init() {        View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);        setContentView(view);        setWidth(LayoutParams.WRAP_CONTENT);        setHeight(LayoutParams.WRAP_CONTENT);        setFocusable(true);        ColorDrawable dw = new ColorDrawable(0x00);        setBackgroundDrawable(dw);        mListView = (ListView) view.findViewById(R.id.listview);        mListView.setOnItemClickListener(this);    }    public void refreshData(List<String> list, int selIndex) {        if (list != null && selIndex != -1) {            if (mAdapter != null) {                mAdapter.refreshData(list, selIndex);            }        }    }        @Override    public void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {        dismiss();        if (mItemSelectListener != null) {            mItemSelectListener.onItemClick(pos);        }    }    }

三、定义Adapter

SpinerAdapter.java

package com.hykjsjkj.customspiner;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.List;/** * Copyright: Copyright (c) 2017-2025 * Company: * * @author: 赵小贱 * @date: 2017/8/23 * describe: */public class SpinerAdapter extends BaseAdapter {    public static interface IOnItemSelectListener {        public void onItemClick(int pos);    }    ;    private List<String> mObjects;    private LayoutInflater mInflater;    public SpinerAdapter(Context context, List<String> mObjects) {        this.mObjects = mObjects;        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    }    public void refreshData(List<String> objects, int selIndex) {        mObjects = objects;        if (selIndex < 0) {            selIndex = 0;        }        if (selIndex >= mObjects.size()) {            selIndex = mObjects.size() - 1;        }    }    @Override    public int getCount() {        return mObjects.size();    }    @Override    public Object getItem(int pos) {        return mObjects.get(pos).toString();    }    @Override    public long getItemId(int pos) {        return pos;    }    @Override    public View getView(int pos, View convertView, ViewGroup arg2) {        ViewHolder viewHolder;        if (convertView == null) {            convertView = mInflater.inflate(R.layout.spiner_item_layout, null);            viewHolder = new ViewHolder();            viewHolder.mTextView = (TextView) convertView.findViewById(R.id.textView);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        //Object item =  getItem(pos);        viewHolder.mTextView.setText(mObjects.get(pos));        return convertView;    }    public static class ViewHolder {        public TextView mTextView;    }}

四、调用示例

MainActivity
package com.hykjsjkj.customspiner;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.RelativeLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Copyright: Copyright (c) 2017-2025 * Company: * * @author: 赵小贱 * @date: 2017/8/23 * describe: */public class MainActivity extends Activity implements View.OnClickListener, SpinerAdapter.IOnItemSelectListener {    private List<String> mListType = new ArrayList<String>();  //类型列表    private TextView mTView;    private SpinerAdapter mAdapter;    private RelativeLayout relativeLayout;    private SpinerPopWindow mSpinerPopWindow;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTView = (TextView) findViewById(R.id.tv_value);        relativeLayout = (RelativeLayout) findViewById(R.id.relativelayout);        //初始化数据        mListType.add("大家好!");        mListType.add("老司机开车啦");        mListType.add("快上车");        mListType.add("快下班了");        mListType.add("下班回家做好吃的");        mListType.add("啦啦啦啦···");        mAdapter = new SpinerAdapter(this, mListType);        mAdapter.refreshData(mListType, 0);        //初始化PopWindow        mSpinerPopWindow = new SpinerPopWindow(this);        mSpinerPopWindow.setAdatper(mAdapter);        mSpinerPopWindow.setItemListener(this);    }    //设置PopWindow    private void showSpinWindow() {        //设置mSpinerPopWindow显示的宽度        mSpinerPopWindow.setWidth(relativeLayout.getWidth());        //设置显示的位置在哪个控件的下方        mSpinerPopWindow.showAsDropDown(relativeLayout);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.relativelayout:                showSpinWindow();//显示SpinerPopWindow                break;        }    }    /**     * SpinerPopWindow中的条目点击监听     * @param pos     */    @Override    public void onItemClick(int pos) {        String value = mListType.get(pos);        mTView.setText(value.toString());    }}
以上就是所有的代码了,希望对大家有所帮助,下面会附上源码,有需要的可以下载来参考:



示例代码下载:http://download.csdn.net/download/zhaoxiaojian1213/9949348