先上效果图:
简单的讲解一下,其实思想就是要有个Listview,popupwindow包着这个列表,此处是封装了一个popupwindow,把需要的数据通过构造函数传入即可,需要的数据有列表的list内容,当前选中的项,监听,需要依附在那个View下显示该popupwindow,具体代码如下:
/**
* Created by lan.zheng on 2016/9/9.
*/
public class RankingPopupWindow extends PopupWindow{
private ListPopupWindowAdapter mListPopupWindowAdapter;
private Listener mListener;
public RankingPopupWindow(final Activity context, List list, String selectName,Listener listener,View view) {
super(context);
mListener = listener;
//拿到基本的item高度,这里给定每个Item的高度和宽度
DisplayMetrics metric = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(metric);
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
float titleItemHeight = density*50; //50dp,高
float paddingWight = density*12; //12dp
WindowManager wm = context.getWindowManager();
int width = wm.getDefaultDisplay().getWidth();
//拿到要显示的总高度,超过5个条目时只显示5个,其余滑动显示
int height;
if(list.size() > 5){
height = (int)titleItemHeight * 5;
}else {
height = (int)titleItemHeight * list.size();
}
this.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
View contentView = LayoutInflater.from(context).inflate(R.layout.popup_window_ranking_classify, null);
this.setContentView(contentView);
ListView listView = (ListView) contentView.findViewById(R.id.lv_ranking_classify);
LinearLayout.LayoutParams lp;
lp= (LinearLayout.LayoutParams) listView.getLayoutParams();
lp.height = height;
lp.width = width/2-(int)paddingWight; //两边有点点空隙
//设置整个ListView的给定宽高
listView.setLayoutParams(lp);
//初始化list适配器,并把数据设置入listView中
if(mListPopupWindowAdapter != null ){
mListPopupWindowAdapter = null;
}
mListPopupWindowAdapter = new ListPopupWindowAdapter(context,list,selectName,titleItemHeight);
listView.setAdapter(mListPopupWindowAdapter);
this.setFocusable(true);
this.setAnimationStyle(R.style.AnimList);
ColorDrawable dw = new ColorDrawable(context.getResources().getColor(R.color.transparent));
this.setBackgroundDrawable(dw);
this.showAsDropDown(view);
//点击Item
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
dismiss();
mListener.onItemClickListener(position);
}
});
//点击返回键
listView.setOnKeyListener(new View.OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
dismiss();
return true;
}
});
//消失监听
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
mListener.onPopupWindowDismissListener();
}
});
//点击外围
this.getContentView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setFocusable(false);
dismiss();
return true;
}
});
}
public interface Listener{
void onPopupWindowDismissListener(); //弹框消失监听
void onItemClickListener(int position); //条目点击监听
}
}
然后是ListView的Adapter,这里xml就不写了,就是一个简单的TextView用于显示listItem
/**
* Created by lan.zheng on 2016/8/30.
*/
public class ListPopupWindowAdapter extends BaseAdapter {
private List mStringList = new ArrayList<>();
private Context mContext;
private String nowSeleteName;
private int itemHeight;
public ListPopupWindowAdapter(Context context,List list,String selectName,float height){
mContext = context;
mStringList = list;
nowSeleteName = selectName;
itemHeight = (int)height;
}
@Override
public int getCount() {
return mStringList.size();
}
@Override
public Object getItem(int i) {
return mStringList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder lViewHolder = null; //一开始为null
if(view == null){
lViewHolder = new ViewHolder();
view = View.inflate(mContext, R.layout.list_item_rank_title_content,null);
lViewHolder.itemTextView = (TextView) view.findViewById(R.id.tv_ranking_title_item);
view.setTag(lViewHolder);
}else {
lViewHolder = (ViewHolder) view.getTag();
}
//文字内容设置
lViewHolder.itemTextView.setText(mStringList.get(i));
LinearLayout.LayoutParams lp;
lp= (LinearLayout.LayoutParams) lViewHolder.itemTextView.getLayoutParams();
lp.height=itemHeight;
lViewHolder.itemTextView.setLayoutParams(lp);
if(mStringList.get(i).equals(nowSeleteName)){ //判断选中项
lViewHolder.itemTextView.setTextColor(mContext.getResources().getColor(R.color.tab_select_text_color));
lViewHolder.itemTextView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.drop_down_list_item_selected));
}else {
lViewHolder.itemTextView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.drop_down_list_item_normal));
lViewHolder.itemTextView.setTextColor(mContext.getResources().getColor(R.color.text_666666));
}
return view;
}
private class ViewHolder {
TextView itemTextView;
} }
R.style.AnimList
看看怎么实现从上往下的弹出效果,先写弹出和收起的效果
list_pop_show_anim
list_pop_hidden_anim
最后就是在styles.xml中写入效果:
最后就是在Activity中使用,来看看怎么使用:RankingPopupWindow mWindow; private void initListItem(final List
list, final int flag, final String selectName){ //生成Listener和清空 setPopupWindowListener(); mWindow = null; //显示popupwindow if(flag == LEFT){ mWindow = new RankingPopupWindow(this,list,selectName,listener,mLeftWeightLayout); }else if(flag == RIGHT){ mWindow = new RankingPopupWindow(this,list,selectName,listener,mRightWeightLayout); } }
RankingPopupWindow.Listener listener; private void setPopupWindowListener(){ listener = null; listener = new RankingPopupWindow.Listener() { @Override public void onPopupWindowDismissListener() { //消失时的操作 } @Override public void onItemClickListener(int position) { //点击Item时的操作 } }
使用的时候非常方便,只需要new 一个PopupWindow和一个该弹框的listener回调即可。