简体   繁体   English

Android在sharedpreferences问题中保存自定义列表视图复选框状态

[英]Android save custom listview checkbox state in sharedpreferences issue

I have a custom listview with textview and checkbox. 我有一个带有textview和复选框的自定义listview。 I want to save the checkbox state in sharedpreferences and get and set it again adapter when activity open. 我想将复选框状态保存在sharedpreferences中,并在活动打开时获取并重新设置适配器。 I have also done this but issue is this: I save the checkbox checked position in sharedpreferences and get it. 我也这样做了,但是问题是这样的:我将复选框选中的位置保存在sharedpreferences中并得到它。 When listview item position change then my checked checkbox position got wrong checked. 当listview项的位置更改时,我选中的复选框位置被错误地选中了。 How can I handle this? 我该如何处理?

adaptor code: 适配器代码:

public class Listadapter extends BaseAdapter {
    CheckBox checkBox;
    boolean index[];
    boolean[] itemChecked;
    ResolveInfo entry;
    String[] itempkg;
    private Context mContext;
    private List<ResolveInfo> mListAppInfo;
    private PackageManager mPackManager;
    private ArrayList<Boolean> checkList = new ArrayList<Boolean>();

    public Listadapter(Context applicationContext, List<ResolveInfo> installedApplication, PackageManager packageManager)
    {
        //super(applicationContext,textViewResourceId,installedApplication);
        super();
        this.mContext = applicationContext;
        this.mListAppInfo = installedApplication;
        index = new boolean[installedApplication.size()];
        this.mPackManager = packageManager;
        for (int i = 0; i < installedApplication.size(); i++) {
            checkList.add(false);
            itemChecked = new boolean[installedApplication.size()];
            itempkg = new String[installedApplication.size()];
        }
    }
    @Override
    public int getCount()
    {
        return mListAppInfo.size();
        //return ((null != mListAppInfo) ? mListAppInfo.size() : 0);
    }
    @Override
    public Object getItem(int position)
    {
        // index = new boolean[mListAppInfo.size()];
        return mListAppInfo.get(position);
    }
    @Override
    public long getItemId(int position)
    {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        final ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            // reference to convertView
            holder.tvAppName = (TextView) convertView
                    .findViewById(R.id.textView1);
            holder.tvPkgName = (TextView) convertView
                    .findViewById(R.id.textView);
            holder.checkBox = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);
            holder.ivAppIcon = (ImageView) convertView
                    .findViewById(R.id.imageView);
            convertView.setTag(holder);
        } else {

            holder = (ViewHolder) convertView.getTag();
        }
        entry = mListAppInfo.get(position);
        holder.ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
        holder.tvAppName.setText(entry.loadLabel(mPackManager));
        holder.tvPkgName.setText(entry.activityInfo.packageName);
        holder.checkBox.setChecked(false);

        if (itemChecked[position])
            holder.checkBox.setChecked(true);
        else
            holder.checkBox.setChecked(false);

        final View finalConvertView = convertView;
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (holder.checkBox.isChecked()) {
                    itemChecked[position] = true;

                } else {
                    itemChecked[position] = false;
                }
            }
        });
        return convertView;
    }
    public void setItemChecked5(boolean[] items5) {
        itemChecked = items5;
    }
    private class ViewHolder
    {
        private ImageView ivAppIcon;
        private TextView tvAppName;
        private TextView tvPkgName;
        private CheckBox checkBox;
    }
} 

activity code: 活动代码:

    public class Profile5Activity extends AppCompatActivity implements AdapterView.OnItemClickListener {

            ListView apps5;
            PackageManager packageManager5;
            static ArrayList<String> checkedValue5;
            Button bt5;
            ResolveInfo pi5 = new ResolveInfo();
            Context context = this;
            static String currentApp5 = "NULL";
            CheckBox cb5;
            Listadapter Adapter5 = null;
            boolean[] itemChecked5;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_profile5);

            itemChecked5 = new boolean[AllApps.getInstalledApplication(this).size()];
            //needPermissionForBlocking(MainActivity.mainContext);
            apps5 = (ListView) findViewById(R.id.list5);
            packageManager5 = getPackageManager();

 SharedPreferences preferencess2 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE);
        Set<String> seta = preferencess2.getStringSet("pkgname5", null);
        if (seta != null && !seta.isEmpty() && !seta.equals("null")) {
            checkedValue5 = new ArrayList<String>(seta);
        }
        else
        {
            checkedValue5 = new ArrayList<String>();
        }


            final boolean[] items5 = new boolean[AllApps.getInstalledApplication(this).size()];

            SharedPreferences preferences5 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE);
            for (int i = 0; i < AllApps.getInstalledApplication(this).size(); ++i) {
                items5[i] = preferences5.getBoolean("checkbox_5" + i, false);
            }

            Adapter5 = new Listadapter(this, AllApps.getInstalledApplication(this), packageManager5);
            Adapter5.setItemChecked5(items5);
            apps5.setAdapter(Adapter5);
            apps5.setOnItemClickListener(this);

        }

        @Override
        public void onItemClick(AdapterView<?> arg0, final View v, final int position, long arg3)
        {
            // TODO Auto-generated method stub

            cb5 = (CheckBox) v.findViewById(R.id.checkBox1);
        final TextView tv5 = (TextView) v.findViewById(R.id.textView);
        final TextView tvv5 = (TextView) v.findViewById(R.id.textView1);
        //pi5 = (ResolveInfo) arg0.getItemAtPosition(position);
        cb5.performClick();

        if (cb5.isChecked()) {
            checkedValue5.add(tv5.getText().toString());
            itemChecked5[position] = true;
            String pname = (tvv5.getText().toString());
            SharedPreferences preferences1 =  context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE);
            SharedPreferences.Editor edit = preferences1.edit();
            Set<String> setttt1 = new HashSet<String>();
            setttt1.addAll(checkedValue5);
            edit.putBoolean("checkbox_5" + position, true);
            edit.putStringSet("pkgname5", setttt1);
            edit.commit();

        } else if (!cb5.isChecked()) {
            checkedValue5.remove(tv5.getText().toString());
            String pname = (tvv5.getText().toString());
            SharedPreferences preferences1 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE);
            SharedPreferences.Editor edit = preferences1.edit();
            Set<String> setttt1 = new HashSet<String>();
            setttt1.addAll(checkedValue5);
            edit.putBoolean("checkbox_5" + position, false);
            edit.putStringSet("pkgname5", setttt1);
            edit.commit();
        }
    }
    }

All things working fine in this code until the list item position change when list item position changed then I got wrong checked value. 在此代码中,所有事情都正常工作,直到列表项位置更改时列表项位置更改,然后我得到了错误的检查值。 Please help me with some code or edit my code where I made mistake. 请为我提供一些代码,或者在我出错的地方编辑我的代码。

To know which item is checked, you should save unique and constant value of each item (position in your case is unique but not constant because it can change). 要知道选中了哪个项目,您应该保存每个项目的唯一且恒定的值(在您的情况下,位置是唯一的,但不是恒定的,因为它可以更改)。 With another object type we will always use id 对于其他对象类型,我们将始终使用id

But in your case, the item is ResolveInfo so you can save entry.activityInfo.packageName to SharedPrefrences because it is diffirent among all items 但是在您的情况下,该项目为ResolveInfo因此您可以将entry.activityInfo.packageName保存到SharedPrefrences因为它在所有项目中都不同

I have same problem for that I have used following: 我有以下问题:

For that I have saved item detail in sharedpreferences and when I add value in list I have checked(compare value with new arraylist(With loop)) then item will added list then it will be worked. 为此,我将项目详细信息保存在sharedpreferences中,当我在列表中添加值时,我检查了一下(将值与新的arraylist(具有循环)进行比较),那么项目将添加列表,然后它将起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM