package me.xiaopan.sketchsample.fragment; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.format.Formatter; import android.view.View; import net.sourceforge.pinyin4j.PinyinHelper; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import me.xiaopan.androidinjector.InjectContentView; import me.xiaopan.androidinjector.InjectView; import me.xiaopan.assemblyadapter.AssemblyRecyclerAdapter; import me.xiaopan.sketchsample.MyFragment; import me.xiaopan.sketchsample.R; import me.xiaopan.sketchsample.adapter.itemfactory.AppItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.AppListHeaderItemFactory; import me.xiaopan.sketchsample.bean.AppInfo; import me.xiaopan.sketchsample.util.ScrollingPauseLoadManager; import me.xiaopan.sketchsample.widget.HintView; /** * 已安装APP列表 */ @InjectContentView(R.layout.fragment_installed_app) public class InstalledAppFragment extends MyFragment { @InjectView(R.id.recyclerView_installedApp_content) private RecyclerView contentRecyclerView; @InjectView(R.id.hint_installedApp_hint) private HintView hintView; private AssemblyRecyclerAdapter adapter = null; @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); contentRecyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); contentRecyclerView.setOnScrollListener(new ScrollingPauseLoadManager(view.getContext())); if (adapter != null) { contentRecyclerView.setAdapter(adapter); contentRecyclerView.scheduleLayoutAnimation(); } else { loadAppList(); } } private void loadAppList() { new AsyncTask<Integer, Integer, List<AppInfo>>() { private Context context = getActivity().getBaseContext(); @Override protected void onPreExecute() { super.onPreExecute(); hintView.loading("正在加载已安装列表,请稍后..."); } @Override protected List<AppInfo> doInBackground(Integer... params) { PackageManager packageManager = context.getPackageManager(); List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0); List<AppInfo> appInfoList = new ArrayList<AppInfo>(packageInfoList.size()); for (PackageInfo packageInfo : packageInfoList) { AppInfo appInfo = new AppInfo(true); appInfo.setName(String.valueOf(packageInfo.applicationInfo.loadLabel(packageManager))); appInfo.setSortName(toPinYin(appInfo.getName())); appInfo.setId(packageInfo.packageName); appInfo.setVersionName(packageInfo.versionName); appInfo.setApkFilePath(packageInfo.applicationInfo.publicSourceDir); appInfo.setAppSize(Formatter.formatFileSize(context, new File(appInfo.getApkFilePath()).length())); appInfo.setVersionCode(packageInfo.versionCode); appInfoList.add(appInfo); } Collections.sort(appInfoList, new Comparator<AppInfo>() { @Override public int compare(AppInfo lhs, AppInfo rhs) { return lhs.getSortName().compareToIgnoreCase(rhs.getSortName()); } }); return appInfoList; } private String toPinYin(String text) { StringBuilder stringBuilder = new StringBuilder(); for (char c : text.toCharArray()) { String[] a = PinyinHelper.toHanyuPinyinStringArray(c); if (a != null) { stringBuilder.append(a[0]); } else { stringBuilder.append(c); } } return stringBuilder.toString(); } @Override protected void onPostExecute(List<AppInfo> appInfoList) { if (getActivity() == null) { return; } hintView.hidden(); List<Object> dataList = new ArrayList<Object>((appInfoList != null ? appInfoList.size() : 0) + 1); dataList.add(String.format("您的设备上共安装了%d款应用", appInfoList != null ? appInfoList.size() : 0)); if (appInfoList != null) { dataList.addAll(appInfoList); } AssemblyRecyclerAdapter adapter = new AssemblyRecyclerAdapter(dataList); adapter.addItemFactory(new AppItemFactory()); adapter.addItemFactory(new AppListHeaderItemFactory()); contentRecyclerView.setAdapter(adapter); contentRecyclerView.scheduleLayoutAnimation(); } }.execute(0); } }