遇到的问题一:布局重用的问题
- 1)返回值必须从0开始;代表不同的布局文件
@Override
public int getItemViewType(int position) {
int flag=datas.get(position).getFlag();
if(flag==10||flag==13){
return 0;
}else{
return 1;
}
}
- 2)listview中有两个不一样的布局
@Override
public int getViewTypeCount() {
return 2;
}
- 3)这里面我发现它在type发生改变的时候convertview会置为空不然不会执行type==1的操作。但是还有一个问题就是,为什么系统程序的那个布局会变成用户程序的。
int type=getItemViewType(position);
if(convertView==null){
if(type==0){
inflate=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflate.inflate(R.layout.apps2_listview, parent,false);
holder=new ViewHolder();
holder.appname=(TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
}
if(type==1){
inflate=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflate.inflate(R.layout.apps_listview, parent,false);
holder=new ViewHolder(convertView);
convertView.setTag(holder);
}
}else{
holder=(ViewHolder) convertView.getTag();
}
- 4)个人感觉ViewHolder类就是用来复用findviewbyid
private static class ViewHolder{
public ImageView icon;
public TextView appname;
public TextView packagename;
public TextView mode;
public ViewHolder() {
}
ViewHolder(View view){
icon=(ImageView) view.findViewById(R.id.image);
appname=(TextView) view.findViewById(R.id.name);
packagename=(TextView) view.findViewById(R.id.packname);
mode=(TextView) view.findViewById(R.id.mode);
}
}
问题二:获取系统应用程序和用户应用程序的方法
- 1)拿到所有的安装的应用程序的包信息
public List<PackageInfo> getInfos(){
List<PackageInfo> info=manager.getInstalledPackages(0);
return info;} - 2)遍历包信息中数据
for(PackageInfo info:getInfos()){
String packname=info.packageName; 得到包名
String appname=info.applicationInfo.loadLabel(manager).toString(); 得到应用的名字
Drawable image=info.applicationInfo.loadIcon(manager); 得到应用的logo
int flags=info.applicationInfo.flags; 得到应用的标志信息 - 3)当满足下面的条件时就是获取了用户的应用程序,否则就是系统的应用程序
if((flags&info.applicationInfo.FLAG_SYSTEM)<=0)
&运算的用法
1)举个例子就好理解了,0010&1010的运算结果
0010
1010
--------(&)
0010
2)0xff二进制就是1111 1111