如何隐藏Android Spinner中的一个项目

Geo*_*gie 99 android spinner

我正在寻找一种方法来隐藏Android微调框小部件中的一个项目.这将允许您模拟没有选择项目的微调器,并确保始终为所选的每个项目调用onItemSelected()回调(如果隐藏项目是"当前"项目).通常,微调器中总有一个项不会生成回调,即当前的回调.

stackoverflow上有一些关于如何禁用(灰显)项目的代码,而不是如何完全隐藏项目,就好像它们不存在一样.

经过多次实验,我想出了一个适用于各种新旧Android平台的黑客解决方案.它有一些小的化妆品缺点,很难注意到.我仍然希望听到一个更正式的解决方案,除了"不要用旋转器做那个".

这总是隐藏微调器中的第一个项目,但可以相当容易地扩展以隐藏任意项目或多个项目.在微调器项列表的开头添加一个包含空字符串的虚拟项.您可能希望在微调器对话框打开之前将当前微调器选择设置为项目0,这将模拟未选择的微调器.

使用ArrayAdapter方法的Spinner设置示例覆盖:

List<String> list = new ArrayList<String>();
list.add("");   //  Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");

// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent)
    {
        View v = null;

        // If this is the initial dummy entry, make it hidden
        if (position == 0) {
            TextView tv = new TextView(getContext());
            tv.setHeight(0);
            tv.setVisibility(View.GONE);
            v = tv;
        }
        else {
            // Pass convertView as null to prevent reuse of special case views
            v = super.getDropDownView(position, null, parent);
        }

        // Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling 
        parent.setVerticalScrollBarEnabled(false);
        return v;
    }
};

dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
Run Code Online (Sandbox Code Playgroud)

Aeb*_*bis 47

要隐藏任意项或多个项,我认为您可以实现自己的适配器并设置要隐藏的索引(或索引的数组列表).

public class CustomAdapter extends ArrayAdapter<String> {

     private int hidingItemIndex;

     public CustomAdapter(Context context, int textViewResourceId, String[] objects, int hidingItemIndex) {
         super(context, textViewResourceId, objects);
         this.hidingItemIndex = hidingItemIndex;
     }

     @Override
     public View getDropDownView(int position, View convertView, ViewGroup parent) {
         View v = null;
         if (position == hidingItemIndex) {
             TextView tv = new TextView(getContext());
             tv.setVisibility(View.GONE);
             v = tv;
         } else {
             v = super.getDropDownView(position, null, parent);
         }
         return v;
     }
 }
Run Code Online (Sandbox Code Playgroud)

并在创建项目列表时使用自定义适配器.

List<String> list = new ArrayList<String>();
list.add("");   //  Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");

int hidingItemIndex = 0;

CustomAdapter dataAdapter = new CustomAdapter(this, android.R.layout.simple_spinner_item, list, hidingItemIndex);

dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
Run Code Online (Sandbox Code Playgroud)

(我没有测试过代码)希望有所帮助.

  • 没有tv.setHeight(0),TextView仍然可见. (12认同)
  • 这不是一个解决方案。问题的更新提供了正确的代码。 (2认同)

Rom*_*ich 19

通过截断列表,可以更容易地隐藏列表末尾的项目.

但您必须先选择它,使其显示在微调器中,然后检查选择是否已更改为显示的其中一个项目.

List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string2");
list.add("string3");
list.add("[Select one]");
final int listsize = list.size() - 1;

ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list) {
    @Override
    public int getCount() {
        return(listsize); // Truncate the list
    }
};

dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
mySpinner.setSelection(listsize); // Hidden item to appear in the spinner
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找一个半小时试图找到一个干净的方法,这是迄今为止最好的方法.只是截断列表,但项目实际存在.优秀. (2认同)

Jij*_*dan 5

要隐藏微调器下拉菜单中的任何项目,您需要根据所需条件传递需要隐藏的项目的位置。我在隐藏从下拉列表中选择的项目的用例中实现了这一点

public class CustomAdapter extends ArrayAdapter<String> {

private List<String> dates;
private int hideItemPostion;

public CustomAdapter (Context context, int resource, List<String> dates) {
    super(context, resource,dates);
    this.dates=dates;
}
public void setItemToHide(int itemToHide)
{
    this.hideItemPostion =itemToHide;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View v = null;
    if (position == hideItemPostion) {
        TextView tv = new TextView(getContext());
        tv.setVisibility(View.GONE);
        tv.setHeight(0);
        v = tv;
        v.setVisibility(View.GONE);
    }
    else
        v = super.getDropDownView(position, null, parent);
    return v;
}}
Run Code Online (Sandbox Code Playgroud)

设置适配器是这样的

final CustomAdapter dataAdapter = new CustomAdapter(this,R.layout.spinner_item,dates);
    dataAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
    dataAdapter.setItemToHide(0);
Run Code Online (Sandbox Code Playgroud)

从下拉列表中选择一些项目后,位置也需要更改

 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, final int i, long l) {
        dataAdapter.notifyDataSetChanged();
            mEPGDateSelector.setSelection(i);
            dataAdapter.setItemToHide(i);}

             @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });
Run Code Online (Sandbox Code Playgroud)


小智 0

我认为将验证放在数组列表上而不是放在 Spinner 上会更好,因为一旦过滤了项目,就可以安全地添加到 Spinner 中