您的位置:首页 > 其它

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

2013-10-31 19:00 399 查看
       今天领导让做个关联应用的功能。大致就是在本地保存一个服务端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优化的文章

其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  界面 手机 优化 动画
相关文章推荐