RecyclerView+PopupWindow实现下拉列表选择效果
2017-10-16 07:58
1156 查看
已适配Android7.0 popuwindow全屏显示问题
实现主要代码:
条目点击事件接口:
调用:
源码地址:
http://pan.baidu.com/s/1geFS4zp
实现主要代码:
/** * Created by miao on 2017/9/29. * 自定义PopupWindow 实现下拉列表效果 */ public abstract class SpinerPopWindow<T> extends PopupWindow{ private List<T> datas; private Context mContext; private LayoutInflater mInflater; private RecyclerView recyclerView; private SpinerAdapter spinerAdapter; private int itemResId; private Activity mActivity; public SpinerPopWindow(Context context,List<T> list,int resId){ this.mContext=context; this.datas = list; mInflater = LayoutInflater.from(mContext); this.itemResId=resId; mActivity= (Activity) context; initPopup(); } /** * 初始化PopupWindow */ private void initPopup(){ View view = mInflater.inflate(R.layout.spiner_window_layout, null); setContentView(view); //设置PopupWindow宽高 //设置PopupWindow宽高 WindowManager windowManager = mActivity.getWindowManager(); Display display = windowManager.getDefaultDisplay(); setWidth(display.getWidth()); setHeight(display.getHeight()); //设置背景 ColorDrawable dw = new ColorDrawable(0x60000000); setBackgroundDrawable(dw); setOutsideTouchable(true); recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); //设置布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); //设置adapter spinerAdapter=new SpinerAdapter(mContext,datas,itemResId); recyclerView.setAdapter(spinerAdapter); } class SpinerAdapter extends RecyclerView.Adapter<SpinerAdapter.SpinerHolder>{ private List<T> spinerList; private Context spinerContext; private LayoutInflater spinerInflater; private int mResId; public SpinerAdapter(Context context,List<T> list,int resId){ this.spinerContext=context; this.spinerList = new ArrayList<>(); this.mResId=resId; if (spinerList != null) { this.spinerList.addAll(list); } spinerInflater = LayoutInflater.from(spinerContext); } public void nodfiyData(List<T> list) { if (list != null) { this.spinerList.clear(); this.spinerList.addAll(list); } notifyDataSetChanged(); } @Override public SpinerHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = spinerInflater.inflate(mResId, parent, false); SpinerHolder holder=new SpinerHolder(view); return holder; } @Override public void onBindViewHolder(SpinerHolder holder, final int position) { setData(holder,position); //条目点击事件 if (mItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mItemClickListener.onItemClick(spinerList.get(position), position); } }); } //长按点击事件 if (mItemLoogClickListener != null) { holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return mItemLoogClickListener.onItemLongClick(spinerList.get(position), position); } }); } } @Override public int getItemCount() { return spinerList.size(); } class SpinerHolder extends RecyclerView.ViewHolder{ public SpinerHolder(View itemView) { super(itemView); } public <T extends View> T getView(int id) { return (T) itemView.findViewById(id); } } //使用接口回调点击事件 private ItemClickListener mItemClickListener; public void setOnItemClickListener(ItemClickListener itemClickListener) { this.mItemClickListener = itemClickListener; } //使用接口回调点击事件 private ItemLongClickListener mItemLoogClickListener; public void setOnItemLongClickListener(ItemLongClickListener itemLongClickListener) { this.mItemLoogClickListener = itemLongClickListener; } } /** * 给布局设置值 * @param holder * @param position 对应的位置 */ public abstract void setData(SpinerAdapter.SpinerHolder holder, int position); /** * 刷新数据 * @param list */ public void nodfiyData(List<T> list){ if(spinerAdapter!=null){ spinerAdapter.nodfiyData(list); } } /** * 点击事件 * @param itemClickListener */ public void setOnItemClickListener(ItemClickListener itemClickListener){ if(spinerAdapter!=null){ spinerAdapter.setOnItemClickListener(itemClickListener); } } /** * 长按事件 * @param itemLongClickListener */ public void setOnItemLongClickListener(ItemLongClickListener itemLongClickListener){ if(spinerAdapter!=null){ spinerAdapter.setOnItemLongClickListener(itemLongClickListener); } } @Override public void showAsDropDown(View anchor) { if(Build.VERSION.SDK_INT >= 24) { Rect rect = new Rect(); anchor.getGlobalVisibleRect(rect); int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom; setHeight(h); } super.showAsDropDown(anchor); } @Override public void showAsDropDown(View anchor, int xoff, int yoff) { if(Build.VERSION.SDK_INT >= 24) { Rect rect = new Rect(); anchor.getGlobalVisibleRect(rect); int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom; setHeight(h); } super.showAsDropDown(anchor, xoff, yoff); } /** * 设置PopupWindow的位置 * * @param parent */ public void showPopupWindow(View parent) { if (!this.isShowing()) { this.showAsDropDown(parent, 0, 2); } else { this.dismiss(); } } }
条目点击事件接口:
/** * Created by Administrator on 2017/5/28. * 点击事件接口 */ public interface ItemClickListener { void onItemClick(Object obj, int position);
/** * Created by Administrator on 2017/5/28. * 长按点击事件接口 */ public interface ItemLongClickListener { boolean onItemLongClick(Object obj, int position); }
调用:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView tvItem1, tvItem2, tvItem3; private List<String> list; private ListPopu listPopu; private View line; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); tvItem1 = (TextView) findViewById(R.id.tv_item1); tvItem2 = (TextView) findViewById(R.id.tv_item2); tvItem3 = (TextView) findViewById(R.id.tv_item3); line = findViewById(R.id.line); tvItem1.setOnClickListener(this); tvItem2.setOnClickListener(this); tvItem3.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); if (listPopu != null) { listPopu.dismiss(); listPopu = null; } else { if(id ==R.id.tv_item2){ setTextDrawable(R.mipmap.up_icon,tvItem2); }else if(id ==R.id.tv_item3){ setTextDrawable(R.mipmap.up_icon,tvItem3); }else if(id ==R.id.tv_item1){ setTextDrawable(R.mipmap.up_icon,tvItem1); } getList(); } } private void getList() { listPopu = new ListPopu(this, list, R.layout.spiner_window_layout_item); //设置PopWindow显示的位置 listPopu.showAsDropDown(line); //条目点击监听 listPopu.setOnItemClickListener(new ItemClickListener() { @Override public void onItemClick(Object obj, int position) { Toast.makeText(MainActivity.this, list.get(position), Toast.LENGTH_LONG).show(); listPopu.dismiss(); listPopu = null; } }); //监听PopupWindow消失 listPopu.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { setTextDrawable(R.mipmap.dow_icon,tvItem1); setTextDrawable(R.mipmap.dow_icon,tvItem2); setTextDrawable(R.mipmap.dow_icon,tvItem3); } }); } class ListPopu extends SpinerPopWindow<String> { public ListPopu(Context context, List<String> list, int resId) { super(context, list, resId); } @Override public void setData(SpinerAdapter.SpinerHolder holder, int position) { TextView item = holder.getView(R.id.item); String s = list.get(position); item.setText(s); } } /** * 初始化数据 */ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add("item:" + i); } } /** * 设置textview右边显示图片 */ private void setTextDrawable(int imageid, TextView tv) { Drawable drawable = getResources().getDrawable(imageid); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); tv.setCompoundDrawables(null, null, drawable, null); } /** * 监听物理返回键 * * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (listPopu != null) { listPopu.dismiss(); listPopu = null; return true; } } return super.onKeyDown(keyCode, event); } }
源码地址:
http://pan.baidu.com/s/1geFS4zp
相关文章推荐
- android自定义spinner,使用AppCompatTextView+PopupWindow 实现下拉选择的功能
- Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)
- Android RecyclerView实现下拉列表功能
- PopupWindow+ReycyclerView打造优雅的下拉列表
- Android单个RecyclerView实现列表嵌套的效果
- Android EditText+ListPopupWindow实现可编辑的下拉列表
- PopupWindow+RecyclerView实现上下滑动框功能
- 自定义Adapter实现RecyclerView的可展开二级列表expand效果
- Android 使用RecyclerView实现列表item重叠效果(使用addItemDecoration方法)
- Android使用RecyclerView实现列表数据选择操作
- 使用RecyclerView 简单实现QQ好友列表展开效果
- PopupView实现两级下拉列表
- 手把手教你用RecyclerView实现猫眼电影选择效果
- Android RecyclerView (一)初学,实现ListView列表效果。
- 关于下拉列表的实现(spinner和PopupWindow+listview)
- EditText+ListPopupWindow实现可编辑的下拉列表
- RecyclerView实现列表上下渐变过渡效果
- Material Design最佳体验(2): 使用RecyclerView、CardView、SwipeRefreshLayout实现下拉刷新列表
- Android RecyclerView (二)初学,实现GridView列表和瀑布流效果。
- Android学习(42) -- 自定义控件(6)下拉选择实现( 动态ListView + popupWindow)