利用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.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很简单,相信大家看代码就很容易看懂的,好了今天就写到这了,