Android - 如何在一个活动中禁用多个微调器的特定项目

Posted

技术标签:

【中文标题】Android - 如何在一个活动中禁用多个微调器的特定项目【英文标题】:Android - How to Disable Specific Item for Multiple Spinner in One Activity 【发布时间】:2020-03-06 06:04:10 【问题描述】:

我在一项活动中有三个旋转器。如何禁用从每个微调器中选择的项目到相应的微调器?

我已经在strings.xml的字符串数组中设置了数据:

<string-array name="preferences">
    <item>American Restaurant</item>
    <item>Ar*** Restaurant</item>
    <item>Asian Restaurant</item>
    <item>Chinese Restaurant</item>
    <item>Filipino Restaurant</item>
    <item>Indonesian Restaurant</item>
    <item>Sushi Restaurant</item>
</string-array>

我将ArrayAdapter 声明如下:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.preferences, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

这是我的微调声明:

spinnerMainPref = findViewById(R.id.main_preference_spinner);
spinnerMainPref.setAdapter(adapter);
spinnerMainPref.setOnItemSelectedListener(this);

spinnerPref2 = findViewById(R.id.preference2_spinner);
spinnerPref2.setAdapter(adapter);
spinnerPref2.setOnItemSelectedListener(this);

spinnerPref3 = findViewById(R.id.preference3_spinner);
spinnerPref3.setAdapter(adapter);
spinnerPref3.setOnItemSelectedListener(this);

我试图操纵 onItemSelected 中的微调器:

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) 

    switch (adapterView.getId()) 
        case R.id.main_preference_spinner:
            String valueMainPref = adapterView.getItemAtPosition(i).toString();
            editor.putString("mainPreference", valueMainPref);
            editor.putInt("mainPreferenceValuePosition", i);
            editor.apply();
            break;

        case R.id.preference2_spinner:
            String valuePref2 = adapterView.getItemAtPosition(i).toString();
            editor.putString("secondPreference", valuePref2);
            editor.putInt("secondPreferenceValuePosition", i);
            editor.apply();
            break;

        case R.id.preference3_spinner:
            String valuePref3 = adapterView.getItemAtPosition(i).toString();
            editor.putString("thirdPreference", valuePref3);
            editor.putInt("thirdPreferenceValuePosition", i);
            editor.apply();
            break;
    

例如,如果用户在spinner one 中选择了特定项目,我想让spinner 2spinner 3 禁用该项目。当用户在spinner 2 中选择特定项目时也是如此,我想让spinner 1spinner 3 禁用该项目。希望你能理解我的问题:)

【问题讨论】:

你能分享一下你现在有什么输出吗? @ArulMani 这是我的输出ibb.co/m9h5BY8 【参考方案1】:

我认为您可以使用如下所示的自定义微调器适配器。

public class MySpinnerAdapter extends BaseAdapter 


    @Override
    public void isEnabled(int position) 
       return getItem(position).isEnabled(); 
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

      if(convertView == null) 
          convertView = View.inflate(parent.getContext(), R.layout.item, null);
      

      if(!isEnabled(position)) 
          convertView.setEnabled(false);
          convertView.setOnClickListener(new View.OnClickListener() 
             @Override
             public void onClick(View v) 
                //NO-OP: Just intercept click on disabled item
             
          );
      

      return convertView;
    

将适配器分配给您的每个微调器。然后在选择一个时调用isEnabled(false) 给其他微调器。无论如何,您必须跟踪此状态,并确保当第一个未选中时,它会再次将其他状态设置为启用状态。

希望对你有帮助。

【讨论】:

【参考方案2】:

你需要覆盖ArrayAdapter.getView()

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.preferences, android.R.layout.simple_spinner_item)
   public View getView(int pos, View convertView, ViewGroup parent) 
       //your logic to disable items
    

【讨论】:

以上是关于Android - 如何在一个活动中禁用多个微调器的特定项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中动态禁用微调器项目

如何根据两个不同活动中其他微调器的位置更改微调器的位置

是否可以使用微调器在相同的 android 活动中添加列表视图

多个微调器计算结果不准确

在同一个片段中实现多个事件监听器 - Android

如何将选定的微调器 id 传递给片段