/ / ListView Zapisz stan zaznaczonego pola - Android, listview

ListView Zapisz stan zaznaczonego pola - Android, listview

Zrobiłem pole wyboru w widoku listy. Jednak po zamknięciu aplikacji i ponownym otwarciu nie zapisuje ona stanu elementów, które mam na liście.

Jednak to nie zadziałało dla mnie i nie mogęwydają się znaleźć odpowiedź, jak rozwiązać ten problem. Jeśli ktokolwiek może mi pomóc poprzez kod dla ListAdapter Activty, jak pokazano poniżej, byłby to docenione.

public class ListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Product> objects;

ListAdapter(Context context, ArrayList<Product> products) {
ctx = context;
objects = products;
lInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return objects.size();
}

@Override
public Object getItem(int position) {
return objects.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}

Product p = getProduct(position);

((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);

CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setOnCheckedChangeListener(myCheckChangList);
cbBuy.setTag(position);
cbBuy.setChecked(p.box);
return view;
}

Product getProduct(int position) {
return ((Product) getItem(position));
}

ArrayList<Product> getBox() {
ArrayList<Product> box = new ArrayList<Product>();
for (Product p : objects) {
if (p.box)
box.add(p);
}
return box;
}

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
};
}

Nie jestem pewien, czy zrobiłem coś źle, czy też umieściłem to w niewłaściwym miejscu lub jeśli cały kod jest nieprawidłowy.

To jest wersja edytowanego rozwiązania z użyciem współdzielonych preferencji:

public class ListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Product> objects;

ListAdapter(Context context, ArrayList<Product> products) {
ctx = context;
objects = products;
lInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return objects.size();
}

@Override
public Object getItem(int position) {
return objects.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}

final Product p = getProduct(position);

((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);

final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
SharedPreferences settings  = ctx.getSharedPreferences("data",ctx.MODE_PRIVATE);
boolean Checked = settings.getBoolean(p.name, false);
cbBuy.setChecked(Checked);



cbBuy.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(cbBuy.isChecked()==true){
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, true).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();

}else{
SharedPreferences settings = ctx.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, false).commit();
Toast.makeText(ctx, "You Deselected" +p.name, Toast.LENGTH_SHORT).show();

}
}
});{

return view;

}

}

Odpowiedzi:

1 dla odpowiedzi № 1

Pola nie są trwałe. Jeśli chcesz utrwalać dane w czasie uruchamiania, musisz je zapisać przy zamknięciu i załadować na starcie.