【问题标题】:Spinner selection not showing微调器选择未显示
【发布时间】:2020-10-28 18:04:32
【问题描述】:

感谢您对我遇到的微调器问题的帮助。

单击下拉箭头时,列表显示正常。但是,单击选择时,微调器视图仍显示为空白。选择的文本不会出现。什么给了?

在 Android Studio 的预览版中,从我分配的 android:entries 来看,它看起来不错。截图在这里:(https://imgur.com/a/vmdPA

如您所见,背景是灰色的,其他一切也是白色背景。所以我不认为颜色是这里的问题。

我已经检查并更改了背景颜色,甚至删除了一些小部件,这样我就可以看到是否有任何东西阻止了选择的出现。

除了正常声明Spinner、Arraylist、创建新的arrayadapter、setDropDwonViewResource、将arrayadapter设置为我需要做的spinner之外还有什么事情吗?

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mStoreSpinner.setAdapter(adapter);

微调器的 XML 也尽可能“简单”:

<Spinner
    android:id="@+id/s_spinner"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toTopOf="@+id/recyclerord"
    app:layout_constraintLeft_toRightOf="@+id/orderID"
    app:layout_constraintTop_toBottomOf="@+id/header"
    app:layout_constraintRight_toRightOf="@+id/ConstraintLayout"
    android:visibility="visible"
    android:layout_marginStart="0dp"
    android:entries="@array/array_test"
    >
</Spinner>

谢谢。

编辑: 这是我添加的。

mStoreSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View v, int postion, long arg3) {
            // TODO Auto-generated method stub
            String spinnerValue= parent.getItemAtPosition(postion).toString();
            Log.d(TAG, "test");
            Toast.makeText(getBaseContext(), "Selected item" + spinnerValue, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mStoreSpinner.setAdapter(adapter);

【问题讨论】:

  • 我还没有实现 onClickListeners - 他们需要在微调器正常工作之前在那里吗?

标签: android spinner


【解决方案1】:

我还没有实现 onClickListeners - 他们需要在微调器正常工作之前在那里吗? 我想是的。

像这样将setOnItemSelectedListener 添加到您的Spinner 中:

mStoreSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View v,
                int postion, long arg3) {
            // TODO Auto-generated method stub
        String  spinnerValue= parent.getItemAtPosition(postion).toString();

            Toast.makeText(getBaseContext(),
                    "Selected item" + spinnerValue,
                    Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

也可以随意查看tutorial 以进一步了解它

编辑

您应该按照以下步骤操作:

声明你的Spinner

Spinner spinner = (Spinner) findViewById(R.id.s_spinner);

创建ArrayAdapter

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(),
        spinerArray, android.R.layout.simple_spinner_item);

设置DropDown

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

设置adapter

spinner.setAdapter(adapter);

有两种方法可以实现setOnItemSelectedListener()

  1. 实现其接口:implements OnItemSelectedListener
  2. 使用setOnItemSelectedListener(new OnItemSelectedListener() {...}

【讨论】:

  • 我刚刚添加了这个,但它仍然不起作用。实际上,吐司也没有出现。
  • 用你已经实现的代码编辑你的问题,看看你是否把它放在正确的地方
  • @HWong 您必须将 setOnItemSelectedListener 放在 setAdapter 下方
  • 其实 - 谢谢!我认为这行得通。我还更改了我的“spinnerArray.add”(它正在从 Firestore 中获取数据)——它也可能是未经处理的 String Firestore 的某种组合。
  • 实际上,补充一点,我想我可能遇到了与stackoverflow.com/questions/48755988/… 相同的问题,但没有应用程序崩溃或错误作为原始海报。在我的情况下,选定的选择没有出现在微调器中。一旦我事先将一个简单的字符串添加到数组中,它就可以工作了。
【解决方案2】:

在此行 android:entries="@array/array_test" 中的微调器控件中的 xml 中的第一个删除,因为如果您在列表中传递适配器,那么已经包含 arraylist 的微调器控件用于删除它并在下面的代码中使用...

 List<String> spinnerArray=new ArrayList<>(); // hear you can add in any array.
    spinnerArray.add("Color");
    spinnerArray.add("abd");
    spinnerArray.add("cde");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

        }

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

        }
    });

【讨论】:

  • 这个答案不正确!此行需要编辑 `ArrayAdapter adapter = new ArrayAdapter&lt;String&gt;(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray); 。 ArrayAdapter 参数 3 必须是资源而不是数组!
【解决方案3】:

这是工作代码,希望对您有所帮助:

<Spinner
  android:id="@+id/spinner"
  style="?android:attr/textViewStyle"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:spinnerMode="dialog"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:textColor="@color/colorBlack"
  android:textColorHint="@color/colorGray"
  android:textSize="@dimen/_14sdp" />

自定义R.layout.list_item

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/_4sdp"
android:paddingLeft="@dimen/_14sdp"
android:paddingRight="@dimen/_14sdp"
android:paddingTop="@dimen/_4sdp"
android:text="Test"
android:textColor="@color/colorGray"
android:textSize="@dimen/_14sdp" />

这样设置适配器:

SpinnerAdapter adapter = new SpinnerAdapter(mActivity, R.layout.list_item,
            android.R.id.text1, yourListHere);
    spinner.setAdapter(adapter);

SpinnerAdapter 代码:

public class SpinnerAdapter extends ArrayAdapter {

    public SpinnerAdapter(@NonNull Context context, @LayoutRes int resource, @IdRes int textViewResourceId, @NonNull Object[] objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public SpinnerAdapter(@NonNull Context context, @LayoutRes int resource, @IdRes int textViewResourceId, @NonNull List objects) {
        super(context, resource, textViewResourceId, objects);
    }

    @Override
    public int getCount() {
        return super.getCount();
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        view.setPadding(0, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
        return view;
    }
}

【讨论】:

  • 有任何使用 ArrayList 的例子吗?除了 ArrayList 之外,看起来与我所拥有的非常相似。
  • 查看带有自定义适配器的更新答案,您可以在其中使用 Object[] 或 List
【解决方案4】:

我有同样的问题。根据我的经验: 如果我们创建 ArrayList 假设为 String 类型,并且我们使用 ArrayAdapter 来绑定列表。那么请确保您已将 ArrayList 转换为 String Array。

ArrayAdapter<String> yourAdapter = 
new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, 
yourArrayList.toArray(new String[yourArrayList.size()]));

这行得通!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多