xtylish
xtylish

Reputation: 115

Android save custom listview checkbox state in sharedpreferences issue

I have a custom listview with textview and checkbox. I want to save the checkbox state in sharedpreferences and get and set it again adapter when activity open. I have also done this but issue is this: I save the checkbox checked position in sharedpreferences and get it. When listview item position change then my checked checkbox position got wrong checked. 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.

Upvotes: 0

Views: 446

Answers (2)

Linh
Linh

Reputation: 60923

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

But in your case, the item is ResolveInfo so you can save entry.activityInfo.packageName to SharedPrefrences because it is diffirent among all items

Upvotes: 1

user6902787
user6902787

Reputation:

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.

Upvotes: 0

Related Questions