选项卡选择未显示

3

关于下拉框的问题,需要您的帮助。

当单击下拉箭头时,列表显示正常。但是,在选择后单击时,旋转器视图仍然为空白,选择的文本不会出现。怎么回事呢?

在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 - 在下拉菜单正常工作之前,它们需要存在吗? - H Wong
4个回答

3

我还没有实现onClickListeners - 在下拉框正常工作之前它们需要存在吗? 我想是的。

像这样在您的Spinner中添加setOnItemSelectedListener

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

        }
    });

同时,可以查看这个教程,更好地理解它。

编辑

您需要按照以下步骤进行:

声明您的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);

设置适配器

spinner.setAdapter(adapter);

实现 setOnItemSelectedListener() 有两种方法:

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

我刚刚添加了这个,但它仍然不起作用。实际上,toast也没有出现。 - H Wong
1
实际上 - 谢谢!我认为那个起作用了。我还改变了我的“spinnerArray.add”(它正在从Firestore获取数据) - 这可能是一些未经过滤的字符串Firestore的组合。 - H Wong
1
实际上,我想补充一下,我认为我可能遇到了与 https://stackoverflow.com/questions/48755988/firebase-firestore-spinner-hack 相同的问题,但是没有像原帖作者那样出现应用程序崩溃或错误。在我的情况下,所选选择项未显示在旋转器中。一旦我事先向数组添加一个简单的字符串,它就可以正常工作。 - H Wong
对我来说,我忘记在适配器上调用 notifyDataSetChanged。 - SloCompTech
@SloCompTech 是的,这种情况确实会发生 :) 如果我帮到了你,请给这个答案点个赞。 - Skizo-ozᴉʞS ツ
显示剩余4条评论

0

这是可用的代码,希望能对您有所帮助:

<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之外,它看起来与我拥有的相似。 - H Wong
请查看更新后的答案,其中您可以使用Object[]或List自定义适配器。 - Viks

0

首先,在这行 android:entries="@array/array_test" 中从xml中删除 spinner 控件中的内容,因为如果您将其传递给列表适配器,则 spinner 控件已包含 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<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray);。ArrayAdapter的第三个参数必须是资源而不是数组! - Jose Mhlanga

0
我曾经遇到过同样的问题。根据我的经验: 如果我们创建了一个String类型的ArrayList,并使用ArrayAdapter来绑定列表。那么请确保您已将ArrayList转换为String数组。
ArrayAdapter<String> yourAdapter = 
new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, 
yourArrayList.toArray(new String[yourArrayList.size()]));

这个有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接