主方法中显示pupubwindow和添加adapter:
LayoutInflater inflater = LayoutInflater.from(MainActivity.this) ;
View view = inflater.inflate(R.layout.popupwindow_search_file, null);
SearchAdapter searchAdapter = new SearchAdapter(searchItems,MainActivity.this);
ListView mListView = (ListView) view.findViewById(R.id.lv_search_file);
mListView.setAdapter(searchAdapter);
final PopupWindow mPopupWindow = new PopupWindow(view,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT);
mPopupWindow.setFocusable(true);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(0));
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.showAsDropDown(MainActivity.this.findViewById(R.id.sv_title),50, -28);
mPopupWindow.update();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(mPopupWindow.isShowing()){
String searchPath = searchItems.get(position).getPath();
int countPage = 0;
for(int i = 0; i < searchPath.length();i++){
if(searchPath.charAt(i) == '/'){
pageIndex = ++countPage;
}
}
currentpageUrl = searchPath;
requestPage(searchPath);
mPopupWindow.dismiss();
}
}
});
adapter中的代码:
public class SearchAdapter extends BaseAdapter {
private List<SearchItem> items;
private Context context;
public SearchAdapter(List<SearchItem> items, Context context) {
this.items = items;
this.context = context;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.search_item, null);
viewHolder.name = (TextView) convertView.findViewById(R.id.tv_search_item);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.name.setText(items.get(position).getPath() + "/" + items.get(position).getName());
return convertView;
}
class ViewHolder {
TextView name;
}
}
adapter中R.layout.search_item中的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_search_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/dp8"
android:paddingBottom="@dimen/dp8"
android:paddingLeft="@dimen/dp15"
android:text="name"/>
</LinearLayout>
popupwindow中的R.layout.popupwindow_search_file的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv_search_file"
android:background="@color/white"
android:layout_width="260dp"
android:layout_height="160dp"></ListView>
</LinearLayout>
注释:
设置进场动画:
mPop.setAnimationStyle(R.style.AnimationPreview);//设置动画样式
mPop.setOutsideTouchable(true);//这里设置显示PopuWindow之后在外面点击是否有效。如果为false的话,那么点击PopuWindow外面并不会关闭PopuWindow。当然这里很明显只能在Touchable下才能使用。
当有mPop.setFocusable(false);的时候,说明PopuWindow不能获得焦点,即使设置设置了背景不为空也不能点击外面消失,只能由dismiss()消失,但是外面的View的事件还是可以触发,back键也可以顺利dismiss掉。当设置为popuWindow.setFocusable(true);的时候,加上下面两行设置背景代码,点击外面和Back键才会消失。
mPop.setFocusable(true);
需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者back键PopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindow.showAsDropDown(v);或者其它的显示PopuWindow方法之前设置它的背景不为空:
mPop.setBackgroundDrawable(new ColorDrawable(0));
mPop.showAsDropDown(anchor, 0, 0);//设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量
mPop.showAtLocation(findViewById(R.id.parent), Gravity.LEFT, 0, -90);(以某个View为参考),表示弹出窗口以parent组件为参考,位于左侧,偏移-90。
mPop.setOnDismissListenerd(new PopupWindow.OnDismissListener(){})//设置窗口消失事件