根据先前选择的在 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:

这就是我填充名为 mDataSetArray 的方式:

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 复选框的保存状态,您只需要做的是:

  1. 首先,您需要获取最新的安装包列表。

  2. Select data/checkbox 来自 SQLite 的值,其中包名称与 最新的软件包列表。

  3. 现在,因为您已经从 SQLite 中保存了复选框值,所以创建数据集 使用最新安装的应用程序列表和您选择的复选框值 来自 SQLite.

  4. 传给你的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);