Spinner不显示选定的值

时间:2013-12-03 14:52:27

标签: android arraylist spinner selected

我已经通过数据库填充数组列表来实现微调器。我可以在我的微调器数组适配器中获取并显示数组列表但是如果我在微调器中选择它没有在微调器中显示?我在这里有什么错误?

这是我的代码,

 Spinner spinner1 = (Spinner) findViewById(R.id.prospin);
     ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, providerlist);

  adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(adapter1);

我使用此

获取所选的项目字符串
Spinner provid = (Spinner)findViewById(R.id.prospin);
String provider =provid.getSelectedItem().toString();

任何人都可以帮帮我!!!

25 个答案:

答案 0 :(得分:41)

这个答案可能有点愚蠢,但试试吧。它对我有用。

  1. 检查微调器的背景颜色!
  2. 如果它变白了
  3. 享受吧!

答案 1 :(得分:13)

我遇到了同样的问题,并在Spinner中绑定数据后添加了notifyDataSetChanged()

首先,我使用空白 ArrayList绑定适配器,然后从服务器获取项目列表并添加到该列表但在更新列表后忘记notifyDataSetChanged()

在更新列表后添加adapter.notifyDataSetChanged();

希望它会有所帮助。

答案 2 :(得分:10)

问题:

Spinner既不显示默认值也不显示选定项目值。但选择后会显示下拉菜单项。

原因:

背景和文字颜色都是白色!!!

解决方案:

XML(优选):

为spiner项目编写自定义布局,并使用它而不是默认值android.R.layout.simple_spinner_item

How to change spinner text size and text color?

代码(不太可靠):

your_spinner_instance.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
    public void onItemSelected(AdapterView<?> parent, View view, int pos,
                               long id) {
        ((TextView) view).setTextColor(Color.RED);
    }
    public void onNothingSelected(AdapterView<?> parent) {
    }

});

Android需要一些重大更新,或者飞镖扑腾应该接管...

谢谢Catluc

答案 3 :(得分:3)

我正在使用宽度和高度的硬编码值。更改为wrap_content后,它可以工作。

答案 4 :(得分:3)

使用wrap_content作为Spinner的高度。

可能它没有足够的高度来显示文字。

答案 5 :(得分:3)

如果您有自定义适配器,则应更改TextView文本颜色

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView view = (TextView) super.getView(position, convertView, parent);
    view.setTextColor(Color.parseColor("#000000"));
    return view;
}

如果您没有自定义适配器,则应该更改微调器背景

答案 6 :(得分:2)

如果没有正确给出上下文,也会发生这种情况。我正在使用getApplicationContext(),因为它需要getBaseContext()

答案 7 :(得分:1)

试试这个。

 final ArrayList<String> providerlist= new ArrayList<String>();
    Spinner spinner1 = (Spinner) findViewById(R.id.prospin);
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, providerlist);

    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(adapter1);
    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                            // On selecting a spinner item
            String item = providerlist.get(position);

            // Showing selected spinner item
            Toast.makeText(this,
                    "Selected Country : " + item, Toast.LENGTH_LONG).show();
        }

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

        }
    });

答案 8 :(得分:0)

检查以下链接:

  1. http://www.technotalkative.com/android-spinner-example/
  2. http://www.mkyong.com/android/android-spinner-drop-down-list-example/
  3. 否则,尝试将其存储在选择项目上:

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    
                @Override
                public void onItemSelected(AdapterView<?> adapter, View v,
                        int position, long id) {
                    // On selecting a spinner item
                    String item = adapter.getItemAtPosition(position).toString();
    
                    // Showing selected spinner item
                    Toast.makeText(getApplicationContext(),
                            "Selected Country : " + item, Toast.LENGTH_LONG).show();
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub
    
                }
            });
    

答案 9 :(得分:0)

在我的情况下,列表是从firestore中填充的,然后才提供给适配器构造。该列表已经填充,并显示在微调器中。但是列表的大小返回了零。因此,我只能从列表中选择项目,但微调器文本中没有任何显示,并且无法调用onitemselected部件。以前,我对querysnapshot进行了回调,并从快照中填充了列表。它仅导致将项目添加到微调器,但无法选择。我通过对列表进行回调来解决此问题,而不是通过存储库类中的querysnapshot解决此问题,在此之后,我的列表得到了很好的填充,其大小正确且旋转器工作正常。.我的代码附在这里..希望对您有所帮助。 ..

//interface
 public interface SprRbaCallback{
        void onSprRbaCallback(List<String> list);
    }
//Repository class
 public void getRBA(final SprRbaCallback sprRbaCallback){

        rbaCollection.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                for(DocumentSnapshot snapshot : queryDocumentSnapshots){
                    String item = (String) snapshot.get("dealerName");
                    assert item != null;
                    Log.d(TAG, item);

                    list.add(item);
                }
                Log.d(TAG, String.valueOf(list.size()));
                sprRbaCallback.onSprRbaCallback(list);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, e.toString());
            }
        });
} 

// calling method..

 private void addItemsToRBASpinner() {
        firebaseRepository.getRBA(new FirebaseRepository.SprRbaCallback() {
            @Override
            public void onSprRbaCallback(List<String> list) {
                int size = list.size();
                Log.d(TAG + "listsize", String.valueOf(size));


                ArrayAdapter<String> sprAdaptSelectRBA = new ArrayAdapter<String>(CreateAccountActivity.this,
                        R.layout.spinneritem, list);

                sprAdaptSelectRBA.setDropDownViewResource(R.layout.rbaspinner_dropdown);
                spr_rbaSelect.setAdapter(sprAdaptSelectRBA);

                sprAdaptSelectRBA.notifyDataSetChanged();

                spr_rbaSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        Log.d("NOBY", "ENTERED ON ITEMSELETED");

                        txt_selectedRBA = (String) parent.getItemAtPosition(position);
                        Toast.makeText(parent.getContext(), "Selected RBA: " + txt_selectedRBA, Toast.LENGTH_LONG).show();

                        Log.d("NOBY", txt_selectedRBA);

                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        Log.d("NOBY", "ENTERED NOTHING SELECTED");
                        txt_selectedRBA = "Dixon";
                    }
                });
            }
        });
    }

这段代码对我来说很好...希望能帮助到别人...:)

答案 10 :(得分:0)

我遇到了同样的问题,没有一个解决方案对我有用。最终发现问题是通过异步任务从firestore db中填充了微调器。 重新排列代码,以便在异步任务完成后设置适配器,瞧!!

答案 11 :(得分:0)

这种情况偶尔会发生,我想这是一个错误,但是有一种变通办法很有趣,但是只需这样做,

在微调器的属性栏中,将背景设置为其他颜色,

在具有旋转器的.xml中,设置:

android:background="@android:drawable/spinner_background_material"

运行代码,它将产生一个错误,指出背景是私有的

删除.xml中android:background的行并再次运行代码,如果不采取额外的步骤将背景色设置为其他颜色,则微调器应该可以很好地显示所有值最好是黑色。

再次运行。

答案 12 :(得分:0)

例如添加白色背景色,并显示详细信息 例如

<Spinner
    android:id="@+id/size_spinner"
   style="@style/FormTextStyle"
    android:drawSelectorOnTop="true"
    android:layout_marginStart="@dimen/default_gap"
    android:background="@android:color/white"
    />

答案 13 :(得分:0)

我只是遇到了这个问题,在尝试了所有列出的解决方案后,发现问题是我将微调器layout_width设置为 60dp

将其更改为fill_parent并解决了问题。

答案 14 :(得分:0)

out_marginLeft="50dp"
            android:layout_marginTop="50dp"
            android:layout_marginRight="50dp"
            android:gravity="center"
            android:orientation="vertical">

            <ProgressBar
                android:id="@+id/progressBar"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_above="@+id/txtProgress"
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:progress="50"
                android:progressTint="@android:color/black" />

            <TextView
                android:id="@+id/txtProgress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="Progress"
                android:textColor="@android:color/black" />
        </LinearLayout>  

Java

答案 15 :(得分:0)

荒诞。我有同样的问题。我做了什么使它起作用: 1.将一些初始数据添加到列表中(例如---请选择--) 2.加载其余数据并将其添加到列表中 3.调用adapter.notifyDatasetChaged()

答案 16 :(得分:0)

对我来说,问题是我正在使用getApplicationContext()。当我更改为this时,效果很好。

ArrayAdapter<*> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, documentsCategories);

答案 17 :(得分:0)

这个答案可能有点愚蠢,但如果你犯了同样的错误,那么试试...... 首先将值设置为ArrayList,然后将该arrayList分配给spinner。 我声明了一个全局arrayList并首先将它设置为spinner,然后从另一个方法向它添加值......那时我遇到了同样的问题。否则,您可以对您的arrayList执行notifyDataSetChanged()。

答案 18 :(得分:0)

试试这段代码==&gt;

ArrayAdapter<String> stateNameAdaptor = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, stateNameList);  
     stateNameAdaptor.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

spnState.setAdapter(stateNameAdaptor);

答案 19 :(得分:0)

我发现的问题与样式表有关。使用此

for (int i = 1; i < nRows - 2; i++)                  // NOT from 0 to nRows - 1
    {
        for (int j = 1; j < nCols - 2; j++)          // NOT from 0 to nCols - 1

对于xml布局,请使用此

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <!-- Customize your theme here. -->
  <item name="windowNoTitle">false</item>
  <item name="windowActionBar">true</item>
  <item name="colorPrimary">@color/colorPrimary</item>
  <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  <item name="colorAccent">@color/colorAccent</item>
</style> 

最后为班级

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fitsSystemWindows="true"
    android:paddingBottom="5dp"
    style="@style/AppTheme">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:paddingLeft="24dp"
        android:paddingRight="24dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Spinner"
            android:layout_marginTop="10dp"
            android:textColor="@color/colorBlack"/>

        <Spinner
            android:id="@+id/Spinner"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:backgroundTint="@color/colorPrimary"
            android:textColorHint="#05ab9a"
            android:padding="15dp"
            style="@style/Base.Widget.AppCompat.Spinner.Underlined"
            tools:targetApi="lollipop" />
    </LinearLayout>
</ScrollView>

答案 20 :(得分:0)

一般情况下,微调器在使用时会被选中,因此尝试将空白或任何其他数据设置为零位置的第一个位置,您将获得所选项目的准确位置。

答案 21 :(得分:0)

在声明的android:spinnerMode="dropdown"元素 xml

中使用Spinner属性

答案 22 :(得分:0)

您应该使用第一个Spinner来获取值。

请尝试以下代码:

String provider = spinner1.getSelectedItem().toString();

您正在做的是获取微调器的默认值。

答案 23 :(得分:-1)

你必须做一些改动:

Spinner spinner1 = (Spinner) findViewById(R.id.prospin);
 ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, providerlist);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

而不是“android.R.layout.simple_spinner_dropdown_item”

adapter1.setDropDownViewResource(android.R.layout.simple_list_item_activated_1);

使用“android.R.layout.simple_list_item_activated_1”

spinner1.setAdapter(adapter1);

它会相应地突出显示所选值。 所选颜色由您的应用默认主题选择。

有关更多信息,请访问以下链接: https://developer.android.com/reference/android/R.layout.html#simple_list_item_activated_1

答案 24 :(得分:-1)

尝试此代码

ArrayAdapter<String> arrayAdapte=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,states);
    arrayAdapte.setDropDownViewResource(android.R.layout.simple_list_item_1 );
    spinnerState.setAdapter(arrayAdapte);

    String data=spinnerState.getSelectedItem().toString(); // this is select particular item from list;

    int position=spinnerState.getSelectedItemPosition(); // this return position of data selected in list;