频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
App显示的ListView的item点击事件,弹出泡泡窗
2017-04-17 09:49:38         来源:augfun的博客  
收藏   我要投稿

泡泡窗的显示,在ListView点击的时候显示,设置好布局文件,然后显示,同时添加动画效果,使用PopupWindow 必须设置背景,不然没有动画。每次显示以前需要清空以前的泡泡窗,activity销毁的时候需要把泡泡窗销毁。

item_popup.xml泡泡窗的布局文件

 



    

    
        
        
    
    
        
        
    
    
        
        
            

泡泡窗显示的逻辑文件AppManagerActivity.java

 

 

package com.ldw.safe.Activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.format.Formatter;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.ldw.safe.R;
import com.ldw.safe.bean.AppInfo;
import com.ldw.safe.engine.AppInfos;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

/*
 * 软件管理
 */
public class AppManagerActivity extends Activity {
	//不用findViewById的方法填充
	@ViewInject(R.id.list_view_callsafe)
	private ListView list_view_callsafe;
	@ViewInject(R.id.tv_rom)
	private TextView tv_rom;
	@ViewInject(R.id.tv_sd)
	private TextView tv_sd;
	
	private List appInfos;//所有应用的集合
	private AppManagerAdapter adapter;
	private ArrayList userAppInfos;//第三方应用的集合
	private ArrayList systemAppInfos;//系统应用的集合
	private PopupWindow popupWindow;
	@ViewInject(R.id.tv_app)
	private TextView tv_app;
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initUi();
        initData();
	}
	
	private class AppManagerAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			//多出2个特殊的条目
			return userAppInfos.size() + systemAppInfos.size() + 2;		}

		@Override
		public Object getItem(int position) {
			//获取到ListView中应该显示的正常的对象
			if(position == 0){
				return null;
			}else if(position == userAppInfos.size() + 1){
				return null;
			}
			AppInfo appInfo;
			if(position < userAppInfos.size() + 1){
				//中间添加了一个条目,需要减掉
				appInfo = userAppInfos.get(position - 1);
			}else{
				//多出了2个特殊条目
				int location = 1 + userAppInfos.size() + 1;
				appInfo = systemAppInfos.get(position - location);
			}
			return appInfo;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(position == 0){
				//第三方应用程序的展示
				TextView textView = new TextView(AppManagerActivity.this);
				textView.setTextColor(Color.WHITE);
				textView.setBackgroundColor(Color.GRAY);
				textView.setText("第三方应用(" + userAppInfos.size() + ")");
				return textView;
			}else if(position == userAppInfos.size() + 1){
				//系统程序的展示
				TextView textView = new TextView(AppManagerActivity.this);
				textView.setTextColor(Color.WHITE);
				textView.setBackgroundColor(Color.GRAY);
				textView.setText("系统应用(" + systemAppInfos.size() + ")");
				return textView;
			}
			
            AppInfo appInfo;

            if (position < userAppInfos.size() + 1) {
                //把多出来的特殊的条目减掉
                appInfo = userAppInfos.get(position - 1);

            } else {

                int location = userAppInfos.size() + 2;

                appInfo = systemAppInfos.get(position - location);
            }
			
			View view = null;
			ViewHoler holder;
			//防止特殊条目的影响,特殊条目的LinearLayout是空的
			if(convertView != null && convertView instanceof LinearLayout){
				view = convertView;
				holder = (ViewHoler) convertView.getTag();
			}else{

				view = View.inflate(AppManagerActivity.this, R.layout.item_app_manager, null);
				holder = new ViewHoler();
				holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
				holder.tv_apksize = (TextView) view.findViewById(R.id.tv_apksize);
				holder.tv_location = (TextView) view.findViewById(R.id.tv_location);
				holder.tv_name = (TextView) view.findViewById(R.id.tv_name);
				view.setTag(holder);				
			}
			//AppInfo appInfo = appInfos.get(position);
			holder.iv_icon.setBackground(appInfo.getIcon());
			holder.tv_apksize.setText(Formatter.formatShortFileSize(AppManagerActivity.this, appInfo.getApkSize()));
			holder.tv_name.setText(appInfo.getApkName());
			if(appInfo.isRom()){
				//手机内存
				holder.tv_location.setText("手机内存");
			}else{
				//sd卡
				holder.tv_location.setText("sd卡内存");
			}
			return view;
		}
		
	}
	
	static class ViewHoler{
		ImageView  iv_icon;
		TextView tv_apksize;
		TextView tv_location;
		TextView tv_name;
	}
	
	private Handler handler = new Handler(){


		@Override
		public void handleMessage(Message msg){
			adapter = new AppManagerAdapter();
			list_view_callsafe.setAdapter(adapter);
		}
	};

	/*
	 * 初始化apk的数据
	 */
	private void initData() {
		//子线程中初始化,防止anr
		new Thread(){

			@Override
			public void run(){
				//获取到安装的所有的应用程序
				appInfos = AppInfos.getAppInfos(AppManagerActivity.this);
				//第三方应用的集合
				userAppInfos = new ArrayList();
				//系统应用的集合
				systemAppInfos = new ArrayList();
				
				for(AppInfo appInfo:appInfos){
					if(appInfo.isUserApp()){
						//第三方应用的集合添加数据
						userAppInfos.add(appInfo);
					}else{
						//系统应用集合添加数据
						systemAppInfos.add(appInfo);
					}
				}
				handler.sendEmptyMessage(0);
				
			}
		}.start();
	}

	//初始化界面
	private void initUi() {
		setContentView(R.layout.activity_app_manager);
		//View viewById = findViewById(R.id.list_view_callsafe);
		//不用findViewById的方法填充
		ViewUtils.inject(this);
		//获取到rom内存的剩余空间
		long rom_freeSpace = Environment.getDataDirectory().getFreeSpace();
		//获取到sd卡的剩余空间
		long sd_freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();
		
		System.out.println("内存可用" + rom_freeSpace + "sd卡可用" + sd_freeSpace);
		
		//格式化存储卡的大小
		tv_rom.setText("内存可用" + Formatter.formatFileSize(this, rom_freeSpace));
		tv_sd.setText("sd卡可用" + Formatter.formatFileSize(this, sd_freeSpace));
		
		//list_view_callsafe的滚动事件监听
		list_view_callsafe.setOnScrollListener(new OnScrollListener(){

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				
			}

			//firstVisibleItem 第一个可见的条的位置
            //visibleItemCount 一页可以展示多少个条目
            //totalItemCount   总共的item的个数
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				System.out.println("firstVisibleItem==" + firstVisibleItem + "visibleItemCount==" + visibleItemCount + " totalItemCount==" + totalItemCount);
				
				//清空现有的泡泡窗
				popupWindowDismiss();
				//滚动的时候根据应用的不同展示不同的特殊条目
                if (userAppInfos != null && systemAppInfos != null) {
                    if (firstVisibleItem > (userAppInfos.size() + 1)) {
                        //系统应用程序
                        tv_app.setText("系统程序(" + systemAppInfos.size() + ")个");
                    } else {
                        //第三方应用程序
                        tv_app.setText("第三方程序(" + userAppInfos.size() + ")个");
                    }
                }
			}
			
		});
		
		//list_view_callsafe添加点击事件,弹出泡泡窗
		list_view_callsafe.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView parent, View view,
					int position, long id) {
				//获取当前点击的对象
				Object obj = list_view_callsafe.getItemAtPosition(position);
				if(obj != null && obj instanceof AppInfo){
					View contentView = View.inflate(AppManagerActivity.this, R.layout.item_popup, null);
					//清空现有的泡泡窗
					popupWindowDismiss();
					
					//ViewGroup.LayoutParams.WRAP_CONTENT表示包裹内容,也可以直接写-2
					popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, -2);
					
					//需要注意:使用PopupWindow 必须设置背景。不然没有动画
                    popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
					
					//location第一个值表示x,第二个值表示y
					int[] location = new int[2];
					//获取view展示到窗体上面的位置,后面两个参数表示在整个屏幕中坐标的相对位置
                    view.getLocationInWindow(location);
					popupWindow.showAtLocation(parent, Gravity.LEFT + Gravity.TOP, 70, location[1]);
					
					//动画效果
					ScaleAnimation sa = new ScaleAnimation(0.5f, 1.0f, 0.5f, 1.0f,
                            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
					
                    sa.setDuration(3000);

                    contentView.startAnimation(sa);
				}
				
			}
			
		});
	
	}
	
	private void popupWindowDismiss() {
		//泡泡窗格式化
		if(popupWindow != null && popupWindow.isShowing()){
			popupWindow.dismiss();
			popupWindow = null;
		}
		
	}
	
	//activity销毁的时候关闭泡泡窗,不然会打印错误信息
    @Override
    protected void onDestroy() {
        popupWindowDismiss();

        super.onDestroy();
    }
}


 

点击复制链接 与好友分享!回本站首页
上一篇:编写高质量代码:改善java的151个建议-学习笔记2
下一篇:图片缩放
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站