先上效果图:
简单的讲解一下,其实思想就是要有个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中写入效果:
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时的操作
}
}