带有开关按钮的 Android ListView - 一次只有一个开关处于活动状态

Posted

技术标签:

【中文标题】带有开关按钮的 Android ListView - 一次只有一个开关处于活动状态【英文标题】:Android ListView with Switch buttons - only one switch active at a time 【发布时间】:2020-10-04 00:55:30 【问题描述】:

我有一个带有两个开关的列表视图。如果一次只能激活一个开关,我希望该功能能够正常工作。

--更新

我的适配器:

 public class NotificationsAdapter extends ArrayAdapter<String> 

private Context context;
private String mTitle[];
private boolean onOff[];

public NotificationsAdapter(Context c, String mTitle[], boolean onOff[])   
    super(c, R.layout.adapter_notifications_layout, R.id.notificationsListTv, mTitle);
    this.context = c;
    this.mTitle = mTitle;
    this.onOff = onOff;


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
  LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.adapter_notifications_layout, parent, false);

    Switch notificationSwitch = view.findViewById(R.id.switchNotificationsDaily);
    TextView myTitle = view.findViewById(R.id.notificationsListTv);

    myTitle.setText(mTitle[position]);
    notificationSwitch.setChecked(onOff[position]);

    view.setClickable(true);
    view.setFocusable(true);
    view.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 

            int size = onOff.length;
            for (int i = 0; i < size; i++) 
                if (i == position) 
                    break;
                
                onOff[i] = false;
            

            if (onOff[position]) 
                notificationSwitch.setChecked(false);
                onOff[position] = false;
             else 
                onOff[position] = true;
                notificationSwitch.setChecked(true);
            
        

    );

    return view;

我的班级:

   private String[] mTitle = new String[]"Once Daily", "Twice Daily";
   private Switch notificationSwitch;
   private boolean[] onOff = new boolean[] false, false;


     NotificationsAdapter notificationsAdapter = new NotificationsAdapter(getActivity(), mTitle, onOff);
    listView = view.findViewById(R.id.notificationsListView);
    listView.setAdapter(notificationsAdapter);
    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    listView.setItemsCanFocus(true);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

        
    );
  

目前使用此代码,我可以选择两个开关同时处于活动状态。当我选择多个开关时,我希望另一个关闭。任何帮助使此功能正常工作将不胜感激。

【问题讨论】:

您目前面临的问题是什么?你能澄清一下吗? 当我选择其中一个开关时,它不会禁用另一个。它允许我同时选择两者。 你能不能放一个日志语句,发现至少listView上的setOnItemClickListener工作正常? 你说得对,onItemClickListener 不起作用。我不知道为什么,它与我用于另一个有效的 ListView 的代码完全相同...... android:descendantFocusability="blocksDescendants" 这允许 OnItemClickListener 工作,但是现在它在 else 上抛出一个空值: else onOff[position] = true; notificationSwitch.setChecked(true); 【参考方案1】:

在你的活动中:-

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

        resetValues(position);

        if (onOff[position]) 
            onOff[position] = false;
         else 
            onOff[position] = true;
        
        notifyDataSetChanged();
    


private void resetValues(int selectedPosition)
    int size = onOff.length;
    for(int i=0; i < size; i++)
        if(i == selectedPosition)
           continue;
        
        onOff[i] = false;
    

在你的适配器中:-

notificationSwitch.setChecked(onOff[position]);

另外,从适配器中删除您的点击侦听器。

逻辑是:- 将除选中项之外的所有其他值设为假,然后根据其先前状态更改选中项的状态。

【讨论】:

我尝试添加此代码,但它仍然允许我同时检查两者是否开启。 android:descendantFocusability="blocksDescendants" 这允许 OnItemClickListener 工作,但是现在它在 else 上抛出一个空值: else onOff[position] = true; notificationSwitch.setChecked(true); 我已将您的代码添加到适配器而不是停止空指针的 onclick,但它仍然允许我同时打开两个开关。 这之后你有没有调用 notifyDatasetChanged() 方法? 检查已编辑的答案,如果您仍然遇到任何问题,请告知。

以上是关于带有开关按钮的 Android ListView - 一次只有一个开关处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章

在android studio中删除一个带有按钮的listview项目

Android:我的带有 ListView 的 App Widget 未通过按钮或更新周期进行更新

单击按钮时如何在android中获取带有ListView值的复选框,EditText?

带有复选框和单选按钮的 Android 列表视图

ListView 项中较暗的按钮

在android的listview中实现音频播放器