您的位置:首页 > 其它

利用Listview实现程序列表展示

2016-11-27 21:13 399 查看

利用Listview实现程序列表展示

先来看一下效果图



这个Demo其实也没有什么难度,主要的难点就是在那两个title上,下来我就带大家看看去怎么实现这个效果

首先获取系统中安装的应用信息

/**
* 获取应用程序信息
*/

public class AppInfoTools {
public static List<AppInfo> getAppInfo(Context context) {
List<AppInfo> list = new ArrayList<>();
//获取PackageManager
PackageManager pm = context.getPackageManager();
//这里的0指的是要获取程序的基本信息
List<PackageInfo> packageInfos = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : packageInfos) {
//包名
String packageName = packageInfo.packageName;
//applica
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
//应用名称 Label
String name = applicationInfo.loadLabel(pm).toString();
//图标
Drawable drawable = applicationInfo.loadIcon(pm);
//占用空间大小
long size = new File(applicationInfo.sourceDir).length();
//程序标记
boolean isSystem = false;
boolean isSD = false;
//判断是用户还是系统程序
int flags = applicationInfo.flags;
//系统程序
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
isSystem = true;
} else {
isSystem = false;
}
//是否在SD中
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
isSD = true;
} else {
isSD = false;
}
list.add(new AppInfo(packageName, name, drawable, size, isSystem, isSD));
}
return list;
}
}


声明listview并给其设置adapter

layout
<ListView
android:id="@+id/lv_softwarem"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>

//在这声明个默认的title
<TextView
android:id="@+id/tv_softwarem_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_bright"
android:padding="8dp"
android:text="用户程序(0)"
android:textSize="18sp"
/>

Activity
public class MainActivity extends AppCompatActivity {
//用户程序集合
private List<AppInfo> userApp = new ArrayList<>();
//系统程序集合
private List<AppInfo> systemApp = new ArrayList<>();
private SoftWareAdapter myAdapter;
private TextView tv_title;
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {
tv_title = (TextView) findViewById(R.id.tv_softwarem_title);
lv = (ListView) findViewById(R.id.lv_softwarem);
initData();
}

private void initData() {
//当手机上APP很多时,这就是个耗时操作,所以需要放在子线程中
new Thread() {
@Override
public void run() {
final List<AppInfo> appInfos = AppInfoTools.getAppInfo(MainActivity.this);
for (AppInfo appInfo : appInfos) {
//判断应用程序信息,将应用程序存放到不同的集合中
if (appInfo.isSystem) {
systemApp.add(appInfo);
} else {
userApp.add(appInfo);
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//给默认title设置text
tv_title.setText("用户程序(" + userApp.size() + ")");
//设置adapter
myAdapter = new SoftWareAdapter(MainActivity.this, systemApp, userApp);
lv.setAdapter(myAdapter);
}
});
}
}.start();
//设置滑动监听
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}
/**
* 滚动时回调的方法
* @param view
* @param firstVisibleItem 当前区域内可视的第一个item
* @param visibleItemCount 当前区域内可视的item总数
* @param totalItemCount item总数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (userApp != null && systemApp != null) {
if (firstVisibleItem >= userApp.size() + 1) {
tv_title.setText("系统程序(" + systemApp.size() + ")");
} else {
tv_title.setText("用户程序(" + userApp.size() + ")");
}
}
}
});
}
}


接下来就是我们的重头戏了,创建adapter

public class SoftWareAdapter extends BaseAdapter {
private List<AppInfo> userApp ;
private List<AppInfo> systemApp;
private Context context;

public SoftWareAdapter(Context context, List<AppInfo> systemApp, List<AppInfo> userApp) {
this.context = context;
this.systemApp = systemApp;
this.userApp = userApp;
}

@Override
public int getCount() {
return userApp.size() + systemApp.size() + 2;
}

@Override
public Object getItem(int position) {
return null;
}

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

//拿到指定position的条目类型
@Override
public int getItemViewType(int position) {
//标题布局类型
if (position == 0 || position == userApp.size() + 1) {
return 0;
}
//条目布局
return 1;
}

//设置条目类型个数
@Override
public int getViewTypeCount() {
return 2;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//调用getItemViewType方法,根据条目的显示的样式类型,设置条目显示相应的样式
if (getItemViewType(position) == 0) {
TextView textView = new TextView(context);
textView.setTextSize(18);
textView.setPadding(8, 8, 8, 8);
textView.setBackgroundColor(Color.BLUE);
//标题布局类型
if (position == 0) {
textView.setText("用户程序(" + userApp.size() + ")");
} else {
textView.setText("系统程序(" + systemApp.size() + ")");
}
return textView;
} else {
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_software, null);
convertView.setTag(new ViewHolder(convertView));
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
//判断当前位置
AppInfo info;
if (position <= userApp.size()) {
info = userApp.get(position - 1);
} else {
info = systemApp.get(position - userApp.size() - 2);
}
viewHolder.icon.setImageDrawable(info.icon);
viewHolder.name.setText(info.name);
viewHolder.size.setText(android.text
4000
.format.Formatter.formatFileSize(context, info.size));
viewHolder.isSystem.setText(info.isSD ? "SD" : "手机内存");
return convertView;
}
}

static class ViewHolder {
public TextView name;
public TextView isSystem;
public TextView size;
public ImageView icon;

public ViewHolder(View item) {
this.name = (TextView) item.findViewById(R.id.tv_item_software_name);
this.icon = (ImageView) item.findViewById(R.id.iv_item_software);
this.size = (TextView) item.findViewById(R.id.tv_item_software_size);
this.isSystem = (TextView) item.findViewById(R.id.tv_item_software_issystem);
}
}
}


这个Demo很简单,相信大家看代码就很容易看懂的,好了今天就写到这了,

代码下载地址:https://github.com/creativityingenuity/listview_prac
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listview 应用
相关文章推荐