【问题标题】:Save Checkbox state in RecyclerView在 RecyclerView 中保存复选框状态
【发布时间】:2016-04-08 21:36:32
【问题描述】:

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

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

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());

}

}

【问题讨论】:

标签: android checkbox


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:
    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 的类,它包含一个字符串和一个布尔值。您的情况类似,因为您只能在 ArrayList 中保存布尔值(而不是 Person),并且在 onBindViewHolder 上,将 checkbox.isChecked 设置为该位置的布尔值。您可以在 RecyclerView 适配器上设置View.OnClickerListener,并将ViewHolder onClickListener 设置为YourAdapterName.this。并像我一样实施该方法,只需忽略Person 的东西,只需更新您的boolean 您可以在适配器onBindViewHolder 方法上看到,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2011-12-31
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多