Android自定义下拉框
2015-10-29 22:32
513 查看
Android自定义下拉框
Android 原生的Spinner下拉框无法满足项目的需要,所以自已用PopupWindow写了一自定下拉框,效果如下:
java代码:CommonSpinner
Activity文件
源码下载地址
Android 原生的Spinner下拉框无法满足项目的需要,所以自已用PopupWindow写了一自定下拉框,效果如下:
java代码:CommonSpinner
package guojunustb.commonspinner; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import java.util.List; /** * Created by guojun on 2015/10/29. */ public class CommonSpinner extends TextView implements View.OnClickListener { private TextView mTvTopView; private Context mContext; private SpinnerPopupWindow mPopupWindow; private List<String> mDatas; private OnSpinnerItemSelectListener mOnSpinnerItemSelectListener; public CommonSpinner(Context context) { this(context, null); } public CommonSpinner(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CommonSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mTvTopView = this; mContext = context; mPopupWindow = new SpinnerPopupWindow(mContext); setOnClickListener(this); } @Override public void onClick(View v) { mPopupWindow.showPopupWindow(mTvTopView); } public void setData(List<String> datas) { this.mDatas = datas; } class SpinnerPopupWindow extends PopupWindow { private Context mContext; private ListView mListView; private MyAdapter mMyAdapter; public SpinnerPopupWindow(Context context) { init(context); } private void init(Context context) { mContext = context; LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.layout_spinner, null); mListView = (ListView) view.findViewById(R.id.listview); mListView.setItemsCanFocus(true); mMyAdapter = new MyAdapter(); mListView.setAdapter(mMyAdapter); this.setContentView(view); //设置宽高 this.setWidth(mListView.getLayoutParams().width); this.setHeight(mListView.getLayoutParams().height); //让popupwindow获取焦点 this.setFocusable(true); this.setOutsideTouchable(true); this.update(); // 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框 ColorDrawable dw = new ColorDrawable(00000000); this.setBackgroundDrawable(dw); //设置动画 this.setAnimationStyle(R.style.SpinnerPopupWindowAnim); } class MyAdapter extends BaseAdapter { @Override public int getCount() { return mDatas == null ? 0 : mDatas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = View.inflate(mContext, R.layout.item_spinner, null); } Button bt = ViewHolder.get(convertView,R.id.bt_item); bt.setText(mDatas.get(position)); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showPopupWindow(mTvTopView); mTvTopView.setText(mDatas.get(position)); if (null != mOnSpinnerItemSelectListener) { mOnSpinnerItemSelectListener.onItemSelectListener(position); } } }); return convertView; } } public void showPopupWindow(View parent) { if (!this.isShowing()) { this.showAsDropDown(parent, -(this.getWidth() -parent.getWidth())/2, 0); } else { this.dismiss(); } } } public void setOnSpinnerItemSelectListener(OnSpinnerItemSelectListener listener) { this.mOnSpinnerItemSelectListener = listener; } public interface OnSpinnerItemSelectListener { void onItemSelectListener(int pos); } }布局文件:layout_spinner.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="111dp" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/listview" android:layout_width="111dp" android:layout_height="190dp" android:paddingTop="10dp" android:descendantFocusability="blocksDescendants" android:background="@mipmap/class_tab_putup" android:divider="@null" android:scrollbars="none" /> </LinearLayout>
Activity文件
package guojunustb.commonspinner; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private CommonSpinner mCommonSpinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); assignViews(); } private void assignViews() { mCommonSpinner = (CommonSpinner) findViewById(R.id.common_spinner); mCommonSpinner.setData(getDatas()); mCommonSpinner.setOnSpinnerItemSelectListener(new CommonSpinner.OnSpinnerItemSelectListener() { @Override public void onItemSelectListener(int pos) { Toast.makeText(MainActivity.this, "pos="+pos, Toast.LENGTH_SHORT).show(); } }); } private List<String> getDatas() { ArrayList<String> list=new ArrayList<>(); for (int i=1;i<15;i++){ list.add("第"+i+"周"); } return list; } }
源码下载地址
相关文章推荐
- Android性能优化之内存篇
- Toolbar使用过程中遇到的问题
- Android代码优化小技巧总结
- Android中四大组件
- android自定义view实现"偷窥"图片
- Android开发中Handler的经典总结
- Android中显示意图和隐式意图
- AndroidTest
- Android Touch事件的分发响应机制
- Android Studio中Button ,Textview中字体自动变成大写的问题
- AndroidStudio实用插件收集
- 解决Android抽屉被击穿问题
- 日报2015/10/29(极客学院安卓视频学习)
- Android 配置文件 manifest 子节点属性说明
- Android中的“再按一次返回键退出程序”实现
- Android实现推送方式解决方案
- 【Android】实现打开关闭效果
- Android抽屉(SlidingDrawer --类似android通知栏下拉效果)
- 用户注册--Android
- 【Android成长之路】全局大喇叭——广播机制的浅谈(发送自定义广播)