gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:09:25 24 4
gpt4 key购买 nike

我的 Activity 中有一个 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 列表中的项目,所以如果我取消选中第一个框,则不会发生任何事情,因为它没有存储在列表中,但如果我选中了第四个项目,那么另一个第四个项目将添加到列表中,如果我取消选中它,第四个项目的两份副本中的一份将被移除,但一份将保留。检查上面的代码。

我知道我的解释很糟糕,而且我的英语也不是很好,但希望你理解:)

最佳答案

为显示/隐藏复选框状态定义一个 boolean 变量,并在 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);

/*
...
*/
}

关于java - Android - 如何更改小部件的可见性并在 recyclerView 的所有项目中显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46191154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com