Ich habe eine benutzerdefinierte Listenansicht mit Textansicht und Kontrollkästchen. Ich möchte den Checkbox-Status in geteilten Preferences speichern und den Adapter bei geöffneter Aktivität erneut abrufen und setzen. Ich habe das auch getan, aber Problem ist das: Ich speichere die Checkbox überprüfte Position in geteilten Präferenzen und bekomme es. Wenn sich die Listenansichtsposition ändert, wurde die Checkbox-Position falsch markiert. Wie kann ich damit umgehen?Android Speichern Sie benutzerdefinierte ListView Checkbox-Status in sharedpreferences Problem
Adaptercode:
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;
}
}
Aktivitätscode:
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();
}
}
}
Alles funktioniert gut in diesem Code, bis der Listenposition Positionswechsel, wenn Listenposition Position dann änderte ich falsch verstanden Überprüfter Wert. Bitte hilf mir mit Code oder bearbeite meinen Code wo ich Fehler gemacht habe.
Warum Sie Text angehängt werden '„checkbox_5“' mit die boolesche Position beim Speichern in geteilter Voreinstellung? – GrIsHu
@GrIsHu ich speichere den checkbox status in sharedprefrences werde dir bitte sagen wie kann ich das mit etwas code umgehen. – xtylish
Ja, ich weiß, dass Sie den Checkbox-Status speichern, aber ich sage, dass Sie nur die Position nur als Schlüssel speichern sollten, während Sie die Position speichern, indem Sie einen Text hinzufügen. Was ich denke, könnte zu einem Problem führen. Versuchen Sie wie folgt 'edit.putBoolean (" "+ Position, false);' – GrIsHu