Ich möchte den aktivierten Status des Kontrollkästchens in meiner Listenansicht speichern, damit die ausgewählten Checkoxen ausgewählt bleiben, wenn ich zu einer anderen Aktivität gehe und dann zu dieser Aktivität zurückkomme. Ich habe einen benutzerdefinierten Adapter verwendet, um 2 Arten von Layout anzuzeigen. Ich habe sparsebooleanray und sharedpreference verwendet, um den aktivierten Status zu speichern. Dies funktioniert bei der Verwendung von List, aber ich bekomme NullPointerException, wenn ich List verwende. Gibt es eine Möglichkeit, den Staat hier zu retten?Fehler beim Speichern des aktivierten Kontrollkästchens in der benutzerdefinierten Listenansicht
public class ListViewActivity extends AppCompatActivity {
SharedPreferences sharedPreferences;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
listView = (ListView) findViewById(R.id.listview);
List<Item> items = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
items.add(new Item("I am TextView layout #" + i, Item.TYPE_TEXTVIEW, false));
items.add(new Item("I am ImageView layout #" + i, Item.TYPE_IMAGEVIEW, false));
}
MultipleLayoutAdapter adapter = new MultipleLayoutAdapter(this, items);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setAdapter(adapter);
sharedPreferences = getSharedPreferences("MySharedPrefs", Context.MODE_PRIVATE);
Set<String> checkedItemsSource = sharedPreferences.getStringSet("checked_items", new HashSet<String>());
SparseBooleanArray checkedItems = convertToCheckedItems(checkedItemsSource);
for (int i = 0; i < checkedItems.size(); i++) {
int checkedPosition = checkedItems.keyAt(i);
listView.setItemChecked(checkedPosition, true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
////got exception here
Set<String> stringSet = convertToStringSet(checkedItems);
sharedPreferences.edit()
.putStringSet("checked_items", stringSet)
.apply();
}
private SparseBooleanArray convertToCheckedItems(Set<String> checkedItems) {
SparseBooleanArray array = new SparseBooleanArray();
for(String itemPositionStr : checkedItems) {
int position = Integer.parseInt(itemPositionStr);
array.put(position, true);
}
return array;
}
private Set<String> convertToStringSet(SparseBooleanArray checkedItems) {
Set<String> result = new HashSet<>();
////got exception here
for (int i = 0; i < checkedItems.size(); i++) {
result.add(String.valueOf(checkedItems.keyAt(i)));
}
return result;
}
}
public class MultipleLayoutAdapter extends BaseAdapter {
private Context context;
private List<Item> items;
public MultipleLayoutAdapter(Context context, List<Item> items) {
this.context = context;
this.items = new ArrayList<>(items);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Item getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return getItem(position).getType();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Item item = getItem(position);
int viewType = getItemViewType(position);
switch (viewType) {
case Item.TYPE_TEXTVIEW:
convertView = inflateTextView(convertView, parent, item);
break;
case Item.TYPE_IMAGEVIEW:
convertView = inflateImageView(convertView, parent, item);
break;
}
return convertView;
}
private View inflateTextView(View convertView, ViewGroup parent, Item item) {
TextViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.textview_list_row, parent, false);
viewHolder = new TextViewHolder(convertView);
convertView.setTag(viewHolder);
}
else {
viewHolder = (TextViewHolder) convertView.getTag();
}
viewHolder.textView.setText(item.getData());
viewHolder.checkBox.setChecked(item.isBox());
return convertView;
}
private View inflateImageView(View convertView, ViewGroup parent, Item item) {
ImageViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.imageview_list_row, parent, false);
viewHolder = new ImageViewHolder(convertView);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ImageViewHolder) convertView.getTag();
}
viewHolder.textView.setText(item.getData());
viewHolder.checkBox.setChecked(item.isBox());
return convertView;
}
static class TextViewHolder {
private TextView textView;
private CheckBox checkBox;
public TextViewHolder(View convertView) {
this.textView = (TextView) convertView.findViewById(R.id.textview);
this.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
}
}
static class ImageViewHolder {
private ImageView imageView;
private TextView textView;
private CheckBox checkBox;
public ImageViewHolder(View convertView) {
this.imageView = (ImageView) convertView.findViewById(R.id.imageview);
this.textView = (TextView) convertView.findViewById(R.id.textview);
this.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
}
}
}
public class Item {
public static final int TYPE_TEXTVIEW = 0;
public static final int TYPE_IMAGEVIEW = 1;
private String data;
private int type;
private boolean box;
private Context context;
public Item(Context context) {
this.context = context;
}
public Item(String data, int type, boolean box) {
this.data = data;
this.type = type;
this.box = box;
}
public String getData() {
return data;
}
public int getType() {
return type;
}
public boolean isBox() {
return box;
}
public void setBox(boolean box) {
this.box = box;
}
}
Ich denke, Sie sollten den Code unten auf ein minimales Beispiel geschnitten und weisen darauf hin, wo der Fehler auftritt. – Eiko
Mögliches Duplikat von [Wie selektiere ich Listenelemente aus einem Listview mit CheckBox und Custom Adapter?] (Http://stackoverflow.com/questions/10911361/how-to-get-selected-list-items-froma-a- listview-with-checkbox-and-custom-adapter) –
Der Link, den Sie zur Verfügung gestellt haben, hat nichts zu speichern checked state @AndroidDeveloper – CodeAssasins