当点击每个ListView的item的时候,弹出Popupwindow,提示用户相应的操作。
给ListView注册一个点击item的事件:
// 设置ListView的点击事件
lv_app_manager.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
AppInfo appInfo;
// 第0个位置是:用户程序标签
if (position == 0) {
return;// 将事件返回
}
// 系统程序标签
else if (position == (userAppInfos.size() + 1)) {
return;
}
// 用户程序
else if (position <= userAppInfos.size()) {
int newposition = position - 1;
appInfo = userAppInfos.get(newposition);
} else {// 系统程序
int newposition = position - 1 - userAppInfos.size() - 1;
appInfo = systemAppinfos.get(newposition);
}
//Toast.makeText(getApplicationContext(), appInfo.getName(), 0).show();
dismissPopupwindow();
TextView contentView = new TextView(getApplicationContext());
contentView.setText(appInfo.getName());
contentView.setTextColor(Color.BLACK);
//ViewGroup.LayoutParams.WRAP_CONTENT = -2;
popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.RED));
int[] location = new int[2];
view.getLocationInWindow(location);
popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP, location[0], location[1]);
}
});
注意ListView的item,画图可以帮助理解。
另外,当ListView滑动的时候,弹出窗体需要关闭掉,当弹出窗体不为空的时候,也需要关闭掉。
private void dismissPopupwindow() {
//把旧的弹出窗体关闭掉
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();popupWindow = null;
}
}
在滚动的时候,调用这个方法。
最后,实现了下面的结果:
可是当我们按下back按键的时候,logcat打印出了下面的错误:
官方给的Popupwindow的定义是:
The popupwindows is a floating container that appears on top of the current activity,也就是说,Popupwindow是绑定在当前Activity上面的,当我们按下返回按钮的时候,Activity调用onDestory方法销毁了,所以报出了泄露窗体的错误,解决的方法很简单,就是在Activity的onDestory方法中,释放Popupwindow:
@Override
protected void onDestroy() {
dismissPopupwindow();
super.onDestroy();
}