文章目录
- 一、添加应用源码分析
- 1、LaunchpadAdapter 适配器
- 2、适配器添加元素
- 3、PackageAppData 元素
一、添加应用源码分析
1、LaunchpadAdapter 适配器
在 io.virtualapp.home.HomeActivity
中 , 点击已安装应用列表中的元素 , 启动安装的 APK 应用 ;
下图显示的 RecyclerView 列表如下 :
代码语言:javascript复制 <android.support.v7.widget.RecyclerView
android:id="@ id/home_launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="vertical"
tools:listitem="@layout/item_launcher_app" />
在 HomeActivity 中定义的 RecyclerView 如下 :
代码语言:javascript复制private RecyclerView mLauncherView;
mLauncherView = (RecyclerView) findViewById(R.id.home_launcher);
设置的适配器如下 :
代码语言:javascript复制private LaunchpadAdapter mLaunchpadAdapter;
2、适配器添加元素
在 io.virtualapp.home.adapters.LaunchpadAdapter
中 , 列表数据源是 List<AppData> mList
, 调用 public void add(AppData model)
添加元素 ;
public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {
private List<AppData> mList;
// 添加元素
public void add(AppData model) {
int insertPos = mList.size() - 1;
mList.add(insertPos, model);
notifyItemInserted(insertPos);
}
}
在 HomeActivity 的 public void addAppToLauncher(AppData model)
方法中 , 添加已安装的应用信息 ,
public class HomeActivity extends VActivity implements HomeContract.HomeView {
@Override
public void addAppToLauncher(AppData model) {
List<AppData> dataList = mLaunchpadAdapter.getList();
boolean replaced = false;
for (int i = 0; i < dataList.size(); i ) {
AppData data = dataList.get(i);
if (data instanceof EmptyAppData) {
mLaunchpadAdapter.replace(i, model);
replaced = true;
break;
}
}
if (!replaced) {
mLaunchpadAdapter.add(model);
mLauncherView.smoothScrollToPosition(mLaunchpadAdapter.getItemCount() - 1);
}
}
}
在 HomeActivity 中声明的 public void addAppToLauncher(AppData model)
方法 , 是在 public void addApp(AppInfoLite info)
方法中调用的 , 应用安装完毕后 , 会调用添加应用到列表中的方法 ;
class HomePresenterImpl implements HomeContract.HomePresenter {
@Override
public void addApp(AppInfoLite info) {
class AddResult {
private PackageAppData appData;
private int userId;
private boolean justEnableHidden;
}
AddResult addResult = new AddResult();
VUiKit.defer().when(() -> {
// 获取安装的应用信息 , 该应用之前是否安装过
// 这里应该是判断 克隆应用 / SD 卡 APK 文件
}).then((res) -> {
addResult.appData = PackageAppDataStorage.get().acquire(info.packageName);
}).done(res -> {
// 是否有多个版本
boolean multipleVersion = addResult.justEnableHidden && addResult.userId != 0;
if (!multipleVersion) {
PackageAppData data = addResult.appData;
data.isLoading = true;
// 添加应用
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, true);
} else {
MultiplePackageAppData data = new MultiplePackageAppData(addResult.appData, addResult.userId);
data.isLoading = true;
// 添加应用
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, false);
}
});
}
}
3、PackageAppData 元素
上述 LaunchpadAdapter
列表适配器的数据源 List<AppData> dataList
, 中的元素类型是 io.virtualapp.home.modelsPackageAppData
;
public class PackageAppData implements AppData {
public String packageName;
public String name;
public Drawable icon;
public boolean fastOpen;
public boolean isFirstOpen;
public boolean isLoading;
}