Reputation: 115
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
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
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