Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化
2013-10-31 19:00
399 查看
今天领导让做个关联应用的功能。大致就是在本地保存一个服务端id到本地客户端的映射,需要客户手动完成这个映射关系。由于一些细节感觉是自己没有注意到的,所以做个记录,也为分享给同样没有注意到这写东西的朋友。
首先,是给Dialog设置出入动画效果,用的是style+anim,以前这中方式我从来没有用过,只会用startAnim...,发现这个又一次赶脚真的比较菜。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201711/cb4e94c34df3079bd70c302064bdba33.gif)
设置代码是这样的:
既然这个方法是通过Window对象来实现的,我想其他拥有Window对象的界面也应该都可以用同样的方式实现出入动画,或者其他的效果把。我目前还没有试,改天试试再说。
还有,R.style.mystyle是这样定义的:
dialog_enter的定义:
dialog_exit的定义:
然后是列出手机上安装的所有应用,虽然一直知道这个东西该怎么弄,但以前一直没动手做个,这里也记录下把,下次用到的时候直接COPY哈~
上面代码中appList集合中是非系统应用,packages集合中是所有的应用,如果需要用到系统应用,只需要将if判断改成==1就行。
另外我还遇到个问题,是我在做应用列表的时候,我打算是用CheckBox放在每个条目的后面,但我想做成单选的效果。
问题是当我的dialog显示的时候我HOME退出再回来,上次选择的那一项仍然处于选中状态,而且我选择其他项的时候不会取消选中状态。
我想的是在activity onPause()的时候把dialog dismiss掉,或者cancel掉,但都不可以,我把dialog置为null的时候程序还会跪。。。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/56e56926852ec0c53514c80d0ebce71b.gif)
下面是我程序的代码,哪位大神知道怎么修改这个bug,请告诉我,小弟不胜感激
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
:
另外,我在做listView 优化的时候,找到篇写的很好的文章,这里分享出来。
ListView优化的文章
其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。
首先,是给Dialog设置出入动画效果,用的是style+anim,以前这中方式我从来没有用过,只会用startAnim...,发现这个又一次赶脚真的比较菜。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201711/cb4e94c34df3079bd70c302064bdba33.gif)
设置代码是这样的:
//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的时候程序还会跪。。。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/56e56926852ec0c53514c80d0ebce71b.gif)
下面是我程序的代码,哪位大神知道怎么修改这个bug,请告诉我,小弟不胜感激
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
:
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优化的文章
其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。
相关文章推荐
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- [高级]Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android自定义Dialog布局listview 实现显示安装的应用
- 请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- ListView+CheckBox实现单选效果
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- (转)Android Launcher研究-----------列出所安装的应用,点击进入相应的应用
- launcher列出所安装的应用,点击进入相应的应用! .
- 请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?
- Android中ListView + CheckBox实现单选、多选效果
- Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android中listview和imageview实现条目单选效果
- Android应用安装完成后在应用程序安装器的安装完成页面点击"打开"后进入app,再按Home键退到桌面再点击桌面app图标会重启app
- 自定义adapter的基础上Listview优化方案以及几个小错误(checkbox吃掉点击事件以及对象重复问题)
- listview里面添加checkbox实现单选,多选