在RecyclerView中保存复选框状态

时间:2016-04-08 12:46:56

标签: android checkbox

我在CheckBoxes中有一个RecyclerView选项列表。当我点击复选框时,状态会发生变化,但在向上和向下滚动后,复选框的状态将会丢失。

如何保存复选框的状态?我正在尝试更改适配器中的状态:

private void setAdapter() {
    if (mAdapter == null) {
        mAdapter = new FacetChildAdapter(mValues, getActivity(), query.getSpecValueAsString(mParentValue.getSlug())) {
            @Override
            protected void onCheckBoxRowClicked(CheckboxRow box, Value value, int adapterPosition) {
                if (type == FacetChildType.Brands) {
                    if (box.isChecked()) {
                        query.removeBrand(value);
                    } else {
                        query.addBrand(value);
                    }
                }

                else if (type == FacetChildType.Categories) {
                    if (box.isChecked()) {
                        query.removeCategory(value);
                    } else {
                        query.addCategory(value);
                    }
                }

                else if (type == FacetChildType.Deals) {
                    if (box.isChecked()) {
                        query.removeDealType(value);
                    } else {
                        query.addDealType(value);
                    }
                }

                else if (type == FacetChildType.Specifications) {
                    if (box.isChecked()) {
                        query.removeSpecification(mParentValue.getSlug(), value);
                    } else {
                        query.addSpecification(mParentValue.getSlug(), value);
                    }
                }

                box.setChecked(!box.isChecked());
                mHeading.setBackText(getResources().getString(R.string.apply));
            }

        };
        mRecyclerView.setAdapter(mAdapter);

    } else {
        mAdapter.setSource(query.getSpecValueAsString(mParentValue.getSlug()));
        mAdapter.refresh(mValues);
    }

}

FacetChildAdapter:

public class FacetChildAdapter extends GenericRecycleAdapter<Value, Holders.TextImageHolder> {
private String source;


public FacetChildAdapter(List<Value> list, Context context, String source) {
    super(list, context);
    this.source = source;
}

public void setSource(String source) {
    this.source = source;
}

@Override
protected void onItem(Value s) {

}

public Holders.TextImageHolder getCustomHolder(View v) {
    return new Holders.TextImageHolder(v) {
        @Override
        public void onCheckBoxRowClicked(CheckboxRow v) {
            FacetChildAdapter.this.onCheckBoxRowClicked(v, mList.get(getAdapterPosition()), getAdapterPosition());

        }
    };
}

protected void onCheckBoxRowClicked(CheckboxRow box, Value value, int adapterPosition) {

}

@Override
public int getLayout() {
    return R.layout.facet_child_row;
}

@Override
public void onSet(final Value item,final Holders.TextImageHolder holder) {
    holder.checkboxRow.setTitle(Html.fromHtml(item.getFullName()));
    holder.checkboxRow.setSubText("(" + String.valueOf(item.getCount()) + ")");
    holder.checkboxRow.setChecked(ShowProductsWithId.containsValueInValueStringLine(source, item.getSlug()));
    holder.checkboxRow.setDisabled(!item.isEnabled());

}

}

2 个答案:

答案 0 :(得分:2)

它可以通过两种方式维护:

1)使用Hashmap存储复选框视图的位置。 您可以存储位置并存储特定视图的唯一ID,然后在使用适配器后可以轻松获取其中的复选框位置。

2)当你可以使用Getter setter类时,你会在其中创建一个整数变量然后你可以轻松地在这个变量中设置位置,如

  • 当您可以选中复选框时,变量值为1
  • 当您取消选中该复选框时,变量值为0

维持您的复选框位置选中或取消选中以下方式。

答案 1 :(得分:-1)

class TeamNamesAdapter extends RecyclerView.Adapter<TeamNamesAdapter.ViewHolder>
        implements ItemTouchHelperAdapter, View.OnClickListener {

    private ArrayList<Person> people;

    public TeamNamesAdapter(TinyDB db) {
        people = new ArrayList<>();
        try {
            ArrayList<Object> peopleAsObjects = db.getListObject(PEOPLE, Person.class);
            for (Object obj : peopleAsObjects) {
                people.add((Person) obj);
            }

            if (db.getListObject(PEOPLE_ORDER, Person.class) == null) {
                db.putListObject(PEOPLE_ORDER, peopleAsObjects);
            }
        }
        catch (NullPointerException e) {
            return;
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.team_names_list_item, null);

        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Person curr = people.get(position);
        holder.name.setText(curr.name);
        holder.name.setChecked(curr.available);
    }

    @Override
    public int getItemCount() {
        return people.size();
    }

    public void addName(String name) {
        if(people.contains(name) || name.isEmpty())
            return;

        people.add(new Person(name, true));
        notifyDataSetChanged();
        update(true);
    }

    @Override
    public void onItemDismiss(int position) {
        people.remove(position);
        notifyItemRemoved(position);
        update(true);
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(people, i, i + 1);
            }
        }
        else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(people, i, i - 1);
            }
        }
        notifyItemMoved(fromPosition, toPosition);
        update(true);
        undoRandomizeButton.setEnabled(false);
    }

    @Override
    public void onClick(View v) {
        if (!(v instanceof CheckedTextView))
            return;

        CheckedTextView ctv = (CheckedTextView) v;
        ctv.toggle();

        String name = ctv.getText().toString();
        for (Person p : people) {
            if (p.name.equals(name)) {
                p.available = ctv.isChecked();
                update(true);
                return;
            }
        }
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        CheckedTextView name;
        public ViewHolder(View itemView) {
            super(itemView);

            name = (CheckedTextView)itemView.findViewById(R.id.name_in_list);
            name.setOnClickListener(TeamNamesAdapter.this);
        }
    }
}

这是一个包含CheckedTextView的列表的recyclerview适配器。我保存了一个名为Person的类,其中包含一个字符串和一个bool。您的情况类似,因为您只能在ArrayList中保留布尔值(而不是Person),而在onBindViewHolder上,将checkbox.isChecked设置为该位置的布尔值。您可以在RecyclerView适配器上设置View.OnClickerListener,并将ViewHolder onClickListener设置为YourAdapterName.this。像我一样实施方法,只需忽略Person内容,只需更新boolean即可 您可以在适配器onBindViewHolder方法上看到