Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化

Posted 小喽啰A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化相关的知识,希望对你有一定的参考价值。


       今天领导让做个关联应用的功能。大致就是在本地保存一个服务端id到本地客户端的映射,需要客户手动完成这个映射关系。由于一些细节感觉是自己没有注意到的,所以做个记录,也为分享给同样没有注意到这写东西的朋友。

首先,是给Dialog设置出入动画效果,用的是style+anim,以前这中方式我从来没有用过,只会用startAnim...,发现这个又一次赶脚真的比较菜。

设置代码是这样的:

//dialog是我自己定义好的
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);
window.setWindowAnimations(R.style.mystyle);
dialog.show();

既然这个方法是通过Window对象来实现的,我想其他拥有Window对象的界面也应该都可以用同样的方式实现出入动画,或者其他的效果把。我目前还没有试,改天试试再说。

还有,R.style.mystyle是这样定义的:

<style name="mystyle" parent="android:Animation">
    <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
    <item name="@android:windowExitAnimation">@anim/dialog_exit</item>
</style>
dialog_enter的定义:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="600"
        android:fromYDelta="100%p" />
</set>

dialog_exit的定义:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="600"
        android:toYDelta="100%p" />
</set>

然后是列出手机上安装的所有应用,虽然一直知道这个东西该怎么弄,但以前一直没动手做个,这里也记录下把,下次用到的时候直接COPY哈~

List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
ArrayList<PackageInfo> appList = new ArrayList<PackageInfo>();
for (int i = 0; i < packages.size(); i++) 
	if ((packages.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) 
		appList.add(packages.get(i));
		packages.get(i).applicationInfo.loadIcon(getPackageManager());
	

上面代码中appList集合中是非系统应用,packages集合中是所有的应用,如果需要用到系统应用,只需要将if判断改成==1就行。


另外我还遇到个问题,是我在做应用列表的时候,我打算是用CheckBox放在每个条目的后面,但我想做成单选的效果。

问题是当我的dialog显示的时候我HOME退出再回来,上次选择的那一项仍然处于选中状态,而且我选择其他项的时候不会取消选中状态。

我想的是在activity onPause()的时候把dialog dismiss掉,或者cancel掉,但都不可以,我把dialog置为null的时候程序还会跪。。。

下面是我程序的代码,哪位大神知道怎么修改这个bug,请告诉我,小弟不胜感激

package com.example.appconfigdemo;

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

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity 
	private Button btn;
	ArrayList<PackageInfo> appList = new ArrayList<PackageInfo>();
	private int selected = -1;
	private CheckBox currBox;
	private AlertDialog dialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn = (Button) findViewById(R.id.btn);
		List<PackageInfo> packages = getPackageManager()
				.getInstalledPackages(0);
		for (int i = 0; i < packages.size(); i++) 
			if ((packages.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) 
				appList.add(packages.get(i));
				packages.get(i).applicationInfo.loadIcon(getPackageManager());
			
		
		btn.setOnClickListener(new OnClickListener() 
			class ViewHolder 
				ImageView icon;
				TextView title;
				TextView version;
				CheckBox isSelected;
			
			@Override
			public void onClick(View v) 
				View view = View.inflate(MainActivity.this,
						R.layout.dialog_bindapp_list, null);
				dialog = new AlertDialog.Builder(MainActivity.this)
						.setView(view).setTitle("非系统应用").create();
				ListView lv = (ListView) view.findViewById(R.id.lv);
				lv.setAdapter(new BaseAdapter() 
					@Override
					public View getView(int arg0, View arg1, ViewGroup arg2) 
						PackageInfo pi = appList.get(arg0);
						View v = null;
						ImageView icon = null;
						TextView title = null;
						TextView version = null;
						CheckBox isSelected = null;
						if (arg1 == null) 
							v = View.inflate(MainActivity.this,
									R.layout.dialog_bindapp_item, null);
							icon = (ImageView) v.findViewById(R.id.icon);
							title = (TextView) v.findViewById(R.id.title);
							version = (TextView) v.findViewById(R.id.version);
							isSelected = (CheckBox) v
									.findViewById(R.id.selected);
							ViewHolder holder = new ViewHolder();
							holder.icon = icon;
							holder.title = title;
							holder.version = version;
							holder.isSelected = isSelected;
							v.setTag(holder);

						 else 
							v = arg1;
							ViewHolder holder = (ViewHolder) v.getTag();
							icon = holder.icon;
							title = holder.title;
							version = holder.version;
							isSelected = holder.isSelected;
						
						icon.setImageDrawable(pi.applicationInfo
								.loadIcon(getPackageManager()));
						title.setText(pi.applicationInfo.loadLabel(
								getPackageManager()).toString());
						version.setText("版本:" + pi.versionName);
						if (arg0 == selected)
							isSelected.setChecked(true);
						else
							isSelected.setChecked(false);
						return v;
					
					@Override
					public long getItemId(int arg0) 
						return arg0;
					
					@Override
					public Object getItem(int arg0) 
						return appList.get(arg0);
					
					@Override
					public int getCount() 
						return appList.size();
					
				);
				lv.setOnItemClickListener(new OnItemClickListener() 
					@Override
					public void onItemClick(AdapterView<?> arg0, View arg1,
							int arg2, long arg3) 
						ViewHolder holder = (ViewHolder) arg1.getTag();
						if (!holder.isSelected.isChecked()) 
							if (currBox != null && currBox.isChecked()) 
								currBox.setChecked(false);
							
							holder.isSelected.setChecked(true);
							selected = arg2;
							currBox = holder.isSelected;
						 else 
							holder.isSelected.setChecked(false);
							selected = -1;
						
					
				);
				Window window = dialog.getWindow();
				window.setGravity(Gravity.BOTTOM);
				window.setWindowAnimations(R.style.mystyle);
				dialog.show();
			
		);
	
	@Override
	protected void onPause() 

		super.onPause();
	



另外,我在做listView 优化的时候,找到篇写的很好的文章,这里分享出来。

ListView优化的文章

其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。




以上是关于Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中列出所有已安装的包及其版本?

es文件浏览器的搜索功能不见了

为啥用浏览器下载app安装不了

iOS 用户已安装应用列表 || XAMARI 表格

按字母顺序排列已安装应用程序的列表

linux中怎样查看已安装的软件