根据先前选择的在 RecyclerView 中设置复选框
set checkbox in RecyclerView based on previously selected
我已经为此苦苦挣扎了一段时间,但找不到解决方案。目前,我使用 PackageManager
将设备上安装的所有应用程序填充到我的 RecyclerView
中。这非常有效,这是我得到的结果:
我遇到的问题是我不知道如何 store/retrieve selected 复选框,让我详细说明一下。
当我 select a Checkbox
我在 onBindViewHolder
中执行以下操作:
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
if (holder.mAppSelect.isChecked()){
//Ok great, I can use this to get the position, package name and app name that was selected/checked
}else{
//and it was un-sellected
}
所以,我可以使用上面的方法来存储 selected 复选框的包名称,并将 checkbox
的状态 boolean
存储在 SQLite
,像这样:
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
if (holder.mAppSelect.isChecked()){
dbManager.insert(holder.mTextViewPackage.getText().toString(), true);
}else{
dbManager.insert(holder.mTextViewPackage.getText().toString(), false);
}
这是我遇到困难的地方。假设我关闭 Activity
并再次打开它,我想从 [=] 中获取 select 的 packages/checkboxes 19=] 并重新设置。
所以,我正在寻找一种方法 "cycle" 通过每个持有人,从持有人那里获取包裹名称,这样我就可以签入 SQLite
如果复选框是 select 之前编辑并相应地设置它。
我认为还值得一提的是,自上次启动应用程序以来,可能已经卸载或安装了应用程序。所以这意味着 getAdapterPosition
不会保持不变。
编辑 1:
这就是我填充名为 mDataSet
的 Array
的方式:
public class AppManager {
private Context mContext;
private AppInfo appInfo;
private ArrayList<AppInfo> myApps;
public AppManager(Context c) {
mContext = c;
myApps = new ArrayList<AppInfo>();
}
public ArrayList<AppInfo> getApps() {
loadApps();
return myApps;
}
private void loadApps() {
List<ApplicationInfo> packages = mContext.getPackageManager().getInstalledApplications(0);
for (ApplicationInfo packageInfo : packages) {
AppInfo newApp = new AppInfo();
newApp.setAppName(getApplicationLabelByPackageName(packageInfo.packageName));
newApp.setAppPackage(packageInfo.packageName);
newApp.setAppIcon(getAppIconByPackageName(packageInfo.packageName));
myApps.add(newApp);
}
Collections.sort(myApps, new Comparator<AppInfo>() {
@Override
public int compare(AppInfo s1, AppInfo s2) {
return s1.getAppName().compareToIgnoreCase(s2.getAppName());
}
});
}
// Custom method to get application icon by package name
private Drawable getAppIconByPackageName(String packageName) {
Drawable icon;
try {
icon = mContext.getPackageManager().getApplicationIcon(packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
// Get a default icon
icon = ContextCompat.getDrawable(mContext, R.drawable.ic_launcher_background);
}
return icon;
}
// Custom method to get application label by package name
private String getApplicationLabelByPackageName(String packageName) {
PackageManager packageManager = mContext.getPackageManager();
ApplicationInfo applicationInfo;
String label = "Unknown";
try {
applicationInfo = packageManager.getApplicationInfo(packageName, 0);
if (applicationInfo != null) {
label = (String) packageManager.getApplicationLabel(applicationInfo);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return label;
}
}
您可以使用共享首选项
当你开始时activity像这样从共享首选项中检索状态
SharedPreferences sharedPreference PreferenceManager.getDefaultSharedPreferences(getAppContext());
for(i=0;i<mDataSet.size();i++)
{
mDataSet.get(i).setSelected(sharedPreference.getBoolean(mDataSet.get(i).getAppPackage(),false));
}
并在您的适配器中像这样保存状态。
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
sharedPreference.edit().putBoolean(mDataSet.get(position).getAppPackage(), isChecked).commit();
});
如我所见,如果 isSelected() returns 为真,您正在按照正确的步骤显示选中的复选框,并保存状态 (checked/unckecked ) SQLite
.
中的复选框
要在关闭并再次打开 Activity
时显示 SQLite
复选框的保存状态,您只需要做的是:
首先,您需要获取最新的安装包列表。
Select data/checkbox 来自 SQLite
的值,其中包名称与
最新的软件包列表。
现在,因为您已经从 SQLite 中保存了复选框值,所以创建数据集
使用最新安装的应用程序列表和您选择的复选框值
来自 SQLite
.
传给你的RecyclerViewAdeptor
。
它应该可以正常工作。
您可以尝试 OnClickListener 而不是 OnCheckedChangeListener
试试这个方法,
1.Use 将包含选定项目的列表。 //selectedlist
如果您想永久存储它,请使用 SharedPref.
2.Choose 项目的数据将是唯一的 //appname as string
3.Set 根据所选列表项检查状态。
if(selectedlist.get(appname)!=null
&& (selectedlist.get(appname).equals("selected"))) {
holder.checkBox.setChecked(true);
}
else {
holder.checkBox.setChecked(false);
}
4。将侦听器添加到您的复选框,
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedlist.get(appname)==null) {
selectedlist.put(appname, "selected");
else if (selectedlist.get(appname).equals("selected"))
selectedlist.put(appname, "not selected");
else
selectedlist.put(appname, "selected");
notifyDataSetChanged();
}
};
holder.checkBox.setOnClickListener(listener);
我已经为此苦苦挣扎了一段时间,但找不到解决方案。目前,我使用 PackageManager
将设备上安装的所有应用程序填充到我的 RecyclerView
中。这非常有效,这是我得到的结果:
我遇到的问题是我不知道如何 store/retrieve selected 复选框,让我详细说明一下。
当我 select a Checkbox
我在 onBindViewHolder
中执行以下操作:
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
if (holder.mAppSelect.isChecked()){
//Ok great, I can use this to get the position, package name and app name that was selected/checked
}else{
//and it was un-sellected
}
所以,我可以使用上面的方法来存储 selected 复选框的包名称,并将 checkbox
的状态 boolean
存储在 SQLite
,像这样:
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
if (holder.mAppSelect.isChecked()){
dbManager.insert(holder.mTextViewPackage.getText().toString(), true);
}else{
dbManager.insert(holder.mTextViewPackage.getText().toString(), false);
}
这是我遇到困难的地方。假设我关闭 Activity
并再次打开它,我想从 [=] 中获取 select 的 packages/checkboxes 19=] 并重新设置。
所以,我正在寻找一种方法 "cycle" 通过每个持有人,从持有人那里获取包裹名称,这样我就可以签入 SQLite
如果复选框是 select 之前编辑并相应地设置它。
我认为还值得一提的是,自上次启动应用程序以来,可能已经卸载或安装了应用程序。所以这意味着 getAdapterPosition
不会保持不变。
编辑 1:
这就是我填充名为 mDataSet
的 Array
的方式:
public class AppManager {
private Context mContext;
private AppInfo appInfo;
private ArrayList<AppInfo> myApps;
public AppManager(Context c) {
mContext = c;
myApps = new ArrayList<AppInfo>();
}
public ArrayList<AppInfo> getApps() {
loadApps();
return myApps;
}
private void loadApps() {
List<ApplicationInfo> packages = mContext.getPackageManager().getInstalledApplications(0);
for (ApplicationInfo packageInfo : packages) {
AppInfo newApp = new AppInfo();
newApp.setAppName(getApplicationLabelByPackageName(packageInfo.packageName));
newApp.setAppPackage(packageInfo.packageName);
newApp.setAppIcon(getAppIconByPackageName(packageInfo.packageName));
myApps.add(newApp);
}
Collections.sort(myApps, new Comparator<AppInfo>() {
@Override
public int compare(AppInfo s1, AppInfo s2) {
return s1.getAppName().compareToIgnoreCase(s2.getAppName());
}
});
}
// Custom method to get application icon by package name
private Drawable getAppIconByPackageName(String packageName) {
Drawable icon;
try {
icon = mContext.getPackageManager().getApplicationIcon(packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
// Get a default icon
icon = ContextCompat.getDrawable(mContext, R.drawable.ic_launcher_background);
}
return icon;
}
// Custom method to get application label by package name
private String getApplicationLabelByPackageName(String packageName) {
PackageManager packageManager = mContext.getPackageManager();
ApplicationInfo applicationInfo;
String label = "Unknown";
try {
applicationInfo = packageManager.getApplicationInfo(packageName, 0);
if (applicationInfo != null) {
label = (String) packageManager.getApplicationLabel(applicationInfo);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return label;
}
}
您可以使用共享首选项
当你开始时activity像这样从共享首选项中检索状态
SharedPreferences sharedPreference PreferenceManager.getDefaultSharedPreferences(getAppContext());
for(i=0;i<mDataSet.size();i++)
{
mDataSet.get(i).setSelected(sharedPreference.getBoolean(mDataSet.get(i).getAppPackage(),false));
}
并在您的适配器中像这样保存状态。
holder.mAppSelect.setOnCheckedChangeListener(null);
holder.mAppSelect.setChecked(mDataSet.get(position).isSelected());
holder.mAppSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDataSet.get(position).setSelected(isChecked);
sharedPreference.edit().putBoolean(mDataSet.get(position).getAppPackage(), isChecked).commit();
});
如我所见,如果 isSelected() returns 为真,您正在按照正确的步骤显示选中的复选框,并保存状态 (checked/unckecked ) SQLite
.
要在关闭并再次打开 Activity
时显示 SQLite
复选框的保存状态,您只需要做的是:
首先,您需要获取最新的安装包列表。
Select data/checkbox 来自
SQLite
的值,其中包名称与 最新的软件包列表。现在,因为您已经从 SQLite 中保存了复选框值,所以创建数据集 使用最新安装的应用程序列表和您选择的复选框值 来自
SQLite
.传给你的
RecyclerViewAdeptor
。
它应该可以正常工作。
您可以尝试 OnClickListener 而不是 OnCheckedChangeListener
试试这个方法,
1.Use 将包含选定项目的列表。 //selectedlist
如果您想永久存储它,请使用 SharedPref.
2.Choose 项目的数据将是唯一的 //appname as string
3.Set 根据所选列表项检查状态。
if(selectedlist.get(appname)!=null
&& (selectedlist.get(appname).equals("selected"))) {
holder.checkBox.setChecked(true);
}
else {
holder.checkBox.setChecked(false);
}
4。将侦听器添加到您的复选框,
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedlist.get(appname)==null) {
selectedlist.put(appname, "selected");
else if (selectedlist.get(appname).equals("selected"))
selectedlist.put(appname, "not selected");
else
selectedlist.put(appname, "selected");
notifyDataSetChanged();
}
};
holder.checkBox.setOnClickListener(listener);