当前位置: 首页 > 知识库问答 >
问题:

单击一个切换按钮后,禁用回收器视图中的所有其他切换按钮

薛烈
2023-03-14

我正在使用RecycerView构建一个切换按钮列表(如numpad),我希望实现:

  • 当用户通过单击某个按钮“打开”该按钮时,将“关闭”所有其他按钮

我尝试在视图holder类中添加OnClickListener,并调用NotifyDataSetChanged(),这样就可以调用OnBindViewholder(final ViewHolder holder,int position),然后更改按钮的状态。

维埃霍尔德

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    ToggleButton button;
    String id;

    public ViewHolder(View itemView) {
        super(itemView);
        button = (ToggleButton) itemView.findViewById(R.id.toggle);
        button.setOnclickListener(this);
    }

    @Override
    public void onClick(View view) {
        ((ToggleButton) view).setChecked(true);
        int pos = getAdapterPosition();
        if (pos != RecyclerView.NO_POSITION) {
            selected = pos;  //store the position of the user clicked button
            notifyDataSetChanged();
        }
    }

我的adpater类中的onBindViewHolder()

public void onBindViewHolder(final ViewHolder holder, int position) {
    String data = mData.get(position);
    holder.id = data;
    holder.button.setText(data);
    holder.button.setTextOn(data);
    holder.button.setTextOff(data);

    if (position != selected) { //if the button is not the user chosen one
        if (holder.button.isChecked()) { // and it's in 'ON' state
            holder.button.toggle(); // toggle it to switch 'OFF'
        }
    }

共有1个答案

越骏俊
2023-03-14

有几件事你做错了。viewholder应该只包含视图,而不是单击处理程序或字符串等(线索在名称中)。当您将ViewHolder绑定到数据类时,您可以添加处理程序并操作视图。

根据我所能确定的,您需要一个切换按钮的简单列表。当一个按钮打开时,其他按钮应该关闭。下面我为您创建的测试适配器演示了这一点。

理想情况下,您可以避免NotifyDataSetChanged,并使用基于行的版本,但由于每次按下切换按钮时,它都会影响到其他每一行,因此在此用例中,除非跟踪选定的行,否则您实际上没有选择余地。

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> {

public static class MyData {
    public boolean Selected = false;
    public String Text;

    public MyData(String text) {
        Text = text;
    }
}

public List<MyData> items = new ArrayList<>();

public TestAdapter() {
    this.items.add(new MyData("Item 1"));
    this.items.add(new MyData("Item 2"));
    this.items.add(new MyData("Item 3"));
}

@Override
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {
    return new VH((
            LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.test_layout, parent, false))
    );
}

@Override
public void onBindViewHolder(TestAdapter.VH holder, int position) {
    final MyData itm = items.get(position);

    holder.button.setChecked(itm.Selected);
    holder.text.setText(itm.Text);

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for (MyData x: items){
                x.Selected=false;
            }
            itm.Selected = true;
            notifyDataSetChanged();
        }
    });

}

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

public class VH extends RecyclerView.ViewHolder {

    ToggleButton button;
    TextView text;

    public VH(View itemView) {
        super(itemView);
        button = itemView.findViewById(R.id.toggle);
        text = itemView.findViewById(R.id.text1);
    }
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">

<ToggleButton
    android:id="@+id/toggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<TextView
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>
 类似资料:
  • 我想做的是禁用一个按钮,当我启用另一个按钮时(因此最多可以激活一个按钮),但我对JS的了解非常基础。任何提示都将不胜感激。 Lorem ipsum dolor sit amet,concetetur adipiscing elit。车辆三体间前庭。前庭等扫描电镜。Ut venenatis sagittis孕妇。Nam enim tortor,lacinia pretium dolor sit am

  • 主要内容:创建切换按钮,切换按钮组,ToggleButton行为,样式切换按钮切换按钮具有两种状态:选择或未选择。 我们通常将两个或多个切换按钮组合成一个组,并允许用户只选择一个按钮或不选择。 创建切换按钮 我们可以使用类的三个构造函数创建一个切换按钮。要创建没有任何字幕或图标的切换按钮。 要创建带有文字说明的切换按钮 要创建带有文字说明和图标的切换按钮。 方法可以将文本设置为,以及方法可以将图像安装到。 切换按钮组 切换组不强制选择至少一个按钮。单击所选的切换按钮可取消选

  • 问题内容: 我正在尝试制作一个通过JToggleButton激活的弹出面板。我希望在选择ToggleButton时将JPanel添加到另一个Jpanel上,而在取消选择ToggleButton时将其隐藏。 我已经声明了JToggleButton并使用了ItemListener。但是发生的事情是,当我选择ToggleButton时,如果我取消选择并再次选择它,则会创建一个面板,然后再次添加另一个JP

  • 我使用Laravel框架作为后端API,在前端使用一些blade PHP文件,特别是用于/admin路由中的身份验证和管理面板。在/admin中,我将显示所有注册用户的列表以及旁边的按钮。(此页面仅对管理员列中的值设置为true的用户可见)。我想切换用户的管理员状态,通过单击用户名旁边的按钮来升级或降级用户。为此,我尝试使用带有get的表单提交方法。我在UserController中定义了如下方法

  • 我有一个名为的变量。是一个字符串,可以是“true”或“false”。 默认设置为“false”。 单击按钮时,我要切换值或。因此,在第一次单击按钮时,将为“true”(因为默认情况下它是false),然后,再次单击时,将更改为“false”,依此类推。 我试过(按照这个答案): 但没有成功。 下面是一个演示: null null

  • 我的菜单显示向下,但然后水平。 我希望每一个导航项目都显示下来,在彼此的上面。 现场测试站点URL:ministerios-elim.herokuapp.com CodePen:(无法使菜单在单击CodePen时出现)。 https://codepen.io/ogonzales/pen/abnqxlg 更新2: 更新3: