根据之前选择的

时间:2018-03-26 05:46:42

标签: java android android-recyclerview android-sqlite android-package-managers

我一直在努力解决这个问题,但是找不到解决方案。目前,我使用RecyclerView在设备上安装了所有已安装的应用PackageManager。这很有效,这是我得到的结果:

wworking

我遇到的问题是我无法弄清楚如何存储/检索所选的复选框,让我详细说明。

当我选择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
            }

因此,我可以使用上面的内容来存储所选复选框的包名称,并在boolean中存储checkbox状态的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并再次打开它,我想获取从SQLite中选择的包/复选框并重新设置。< / p>

所以,我正在寻找一种方法来“循环”每个持有者,从持有者那里获取包名,以便我可以检查SQLite是否先前选中了复选框并相应地设置它。 / p>

我认为值得一提的是,自上次启动应用程序以来,应用程序可能已被卸载或安装。这意味着getAdapterPosition将不会保持不变。

编辑1:

这就是我填充名为Array的{​​{1}}:

的方式
mDataSet

3 个答案:

答案 0 :(得分:1)

您可以做的是使用共享偏好

当您从共享偏好开始活动回溯状态时,如此

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();
           });     

答案 1 :(得分:0)

正如我所看到的,如果isSelected()返回true,则按照正确的步骤显示选中的复选框,并保存SQLite中复选框的状态(选中/未确认)。

要在关闭并再次打开SQLite时显示Activity复选框的已保存状态,您只需执行以下操作:

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

  2. 从包含名称匹配的SQLite中选择数据/复选框值 最新的包裹清单。

  3. 现在,由于您已从SQLite中保存了复选框值,因此请创建数据集 使用最新安装的应用列表和您的复选框值 来自SQLite

  4. 将其传递给您的RecyclerViewAdeptor

  5. 它应该可以正常工作。

答案 2 :(得分:0)

您可以尝试 OnClickListener 而不是 OnCheckedChangeListener

试试这个方法,

1.使用包含所选项目的列表。 //selectedlist 如果您想永久存储它,请使用 SharedPref

2.选择项目的唯一//appname as string

数据

3.根据所选列表项设置检查状态。

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);