Android - 如何更改小部件的可见性并在recyclerView中的所有项目中显示它?

时间:2017-09-13 07:14:52

标签: java android checkbox android-recyclerview

我的活动中有 RecyclerView ,我想在 RecyclerView 中添加多个选项,这是我的适配器:

public class RingtoneItemAdabter extends RecyclerView.Adapter<RingtoneItemAdabter.ViewHolder> {

    private Context context;
    private Activity activity;
    private List<RingtoneItem> list;
    private boolean selectionMode = false;
    private List<RingtoneItem> selectedItems = new ArrayList<>();

    public class ViewHolder extends RecyclerView.ViewHolder {

        public Switch aSwitch;
        public TextView textView;
        public View view;
        public CheckBox checkBox;

        public ViewHolder(View view) {
            super(view);
            this.view = view;
            aSwitch = (Switch) view.findViewById(R.id.ringtone_state_switch);
            textView = (TextView) view.findViewById(R.id.ringtone_title_textview);
            checkBox = (CheckBox) view.findViewById(R.id.selection_checkbox);
        }
    }

    public RingtoneItemAdabter(Context context, Activity activity, List<RingtoneItem> list) {
        this.context = context;
        this.activity = activity;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.recyclerview_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final RingtoneItem item = list.get(position);

        holder.checkBox.setVisibility(selectionMode ? View.VISIBLE : View.GONE);
        holder.textView.setText(item.getTitle());
        holder.aSwitch.setChecked(item.isActive());
        holder.textView.setTextColor(item.isActive() ? Color.BLACK : Color.GRAY);
        holder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    holder.textView.setTextColor(Color.BLACK);
                    item.setActive(true);
                    writeToFile();
                } else {
                    holder.textView.setTextColor(Color.GRAY);
                    item.setActive(false);
                    writeToFile();
                }
            }
        });
        holder.view.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(selectionMode){
                    return false;
                }else {
                    startSelecting();
                    holder.checkBox.setChecked(true);
                    return true;
                }
            }
        });
        holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(selectionMode){
                    holder.checkBox.setChecked(!holder.checkBox.isChecked());
                }
            }
        });
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    selectedItems.add(item);
                }else {
                    selectedItems.remove(item);
                }
                if(selectedItems.size() == 0){
                    stopSelecting();
                }
            }
        });
    }

    @Override
    public int getItemCount() { ... }

    private void writeToFile() { ... }

    private void startSelecting(){
        selectionMode = true;
        notifyDataSetChanged();
    }

    private void stopSelecting(){
        selectionMode = false;
        notifyDataSetChanged();
    }
}

这是 recyclerview_item 中的复选框标记:

    <CheckBox
        android:id="@+id/selection_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

所以我希望 startSelection 方法在每个项目中显示复选框,并使用 stopSelection 方法隐藏每个项目中的复选框。

修改

看起来我遇到了问题,现在的问题是当我点击并按住某个项目时出现了复选框,并且必须选中我长按的项目的复选框,如果我取消选中每个框,复选框应该会消失,这就是应用程序应该如何工作,但是当我尝试它时,它没有工作,当我长按一个项目时,复选框出现在某些情况下会检查另一个复选框,但是在另一种情况下,没有选中任何一个复选框,当我取消选中每个复选框时,复选框会保留在那里。 我知道为什么复选框不会消失,因为例如如果我长时间点击第四个项目,则会出现复选框,但是应该检查第四个项目,而不是第四个项目将被检查,但是第四项是将添加到 selectedItems 列表的项目,因此如果我取消选中第一个框,则不会发生任何事情,因为它没有存储在列表中,但是如果我检查了第四项,那么另外第四个项目将添加到列表中,如果我取消选中它,第四个项目的两个副本中的一个将被删除,但一个将保留。 检查上面的代码。

我知道我的解释非常糟糕,我的英语不是很好,但希望你明白:)

1 个答案:

答案 0 :(得分:0)

为显示/隐藏复选框状态定义一个布尔变量,并在onBindViewHolder设置与该变量相关的复选框的可见性

boolean showCheckboxes = false;

public void startSelection() {
    showCheckboxes = true;
    notifyDataSetChanged();
}

public void stopSelection() {
    showCheckboxes = false;
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    final RingtoneItem item = list.get(position);

    holder.checkBox.setVisibility(showCheckboxes ? View.VISIBLE: View.GONE);

    /*
    ...
    */
}