Spinner未显示选定或默认选项

时间:2017-01-18 02:23:55

标签: android android-spinner

我创建了一个微调器,它接受一些用户生成的字符串(在我的案例类中 - 学校类型)并以典型的微调方式显示它们。尝试从微调器中选择一个项目时出现问题。我可以点击微调器并选择类,但是微调器从不显示我选择了类。在添加用户生成的字符串之前,我有一个完美的字符串数组xml文件。

我尝试在notifyDataSetChanged()方法的末尾添加onCreate(),创建了一个带有透明背景和黑色文字的微调器布局,并设置了setOnItemSelectedListener()。这些都不起作用,所以我将代码恢复到原始状态。

Screenshot of problem:

addAssignment.java

package com.nbdeg.unityplanner;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Spinner;

import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.nbdeg.unityplanner.data.Assignments;
import com.nbdeg.unityplanner.data.Classes;

import java.util.ArrayList;

public class addAssignment extends AppCompatActivity  {

    EditText mAssignmentName;
    EditText mDueDate;
    EditText mExtraInfo;
    Spinner mDueClass;
    SeekBar mPercentComplete;
    int percentComplete = 0;

    FirebaseAnalytics mFirebaseAnalytics;
    DatabaseReference assignmentDb;
    DatabaseReference classDb;
    FirebaseUser user;

    long assignmentCounter;
    ArrayList<String> classList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_assignment);

        // Sets title to "Create an assignment"
        try {getSupportActionBar().setTitle("Create An Assignment");}
        catch (NullPointerException e) {
            e.printStackTrace();
        }

        // Getting number of assignments (serves as assignment ID in database)
        Bundle extras = getIntent().getExtras();
        assignmentCounter = extras.getLong("counter");

        // Finds firebase database
        user = FirebaseAuth.getInstance().getCurrentUser();
        mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
        assignmentDb = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("assignments");
        classDb = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("classes");

        // Gets all classes
        classDb.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                    Classes mClass = userSnapshot.getValue(Classes.class);
                    Log.i("Info", "Class loaded: " + mClass.getClassName());
                    classList.add(mClass.getClassName());
                }
                Log.i("Info", "Classes loaded: " + classList);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            Log.e("DB", "Error: " + databaseError.getMessage());
            }
        });

        // Find view by ID calls
        mAssignmentName = (EditText) findViewById(R.id.assignment_name);
        mDueDate = (EditText) findViewById(R.id.due_date_edittext);
        mExtraInfo = (EditText) findViewById(R.id.extra_homework_info);
        mDueClass = (Spinner) findViewById(R.id.class_spinner);
        mPercentComplete = (SeekBar) findViewById(R.id.percentComplete);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, classList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        mDueClass.setAdapter(adapter);

        // Sets DueDate EditText to open a datepicker when clicked
        new EditTextDatePicker(this, R.id.due_date_edittext);

        mPercentComplete.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                percentComplete = progress;
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
    }

    // Adds a SAVE button to the Action Bar
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.save, menu);
        return true;
    }

    // Gets and saves information when SAVE is clicked

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Getting information from views
        String dueDate = mDueDate.getText().toString();
        String assignmentName = mAssignmentName.getText().toString();
        String extraInfo = mExtraInfo.getText().toString();
        String dueClass = mDueClass.getItemAtPosition(mDueClass.getSelectedItemPosition()).toString();

        mFirebaseAnalytics.logEvent("Assignment Created", null);
        Log.i("DB", "Creating assignment named " + assignmentName);
        assignmentDb.child(Long.toString(assignmentCounter)).setValue
                (new Assignments(assignmentName, dueClass, dueDate, extraInfo, percentComplete));

        /*
        // Test to make sure info is being collected correctly.
        Log.i("Class", dueClass);
        Log.i("Due", dueDate);
        Log.i("Name", homeworkName);
        Log.i("Extra", extraInfo);
        */

        // Bring user back to MainActivity
        startActivity(new Intent(addAssignment.this, MainActivity.class));

        return super.onOptionsItemSelected(item);
    }
}

activity_add_assignment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_add_homework"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.nbdeg.unityplanner.addAssignment">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:inputType="textCapSentences"
        android:ems="10"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:id="@+id/assignment_name"
        android:hint="Assignment Name"
        android:padding="5dp"
        android:textSize="18sp"
        android:background="@null" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#c0c0c0"
        android:layout_below="@id/assignment_name"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="43dp"
        android:orientation="horizontal"
        android:layout_below="@id/assignment_name"
        android:layout_alignParentStart="true"
        android:id="@+id/linearLayout">

        <Spinner
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:id="@+id/class_spinner"
            android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
            android:layout_weight="1"
            android:background="@null"/>

        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="#c0c0c0"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/due_date_edittext"
            android:padding="5dp"
            android:focusable="false"
            android:hint="Due Date"
            android:textSize="16sp"
            android:background="@null" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#c0c0c0"
        android:layout_below="@id/linearLayout"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@+id/linearLayout"
        android:layout_alignParentStart="true"
        android:id="@+id/percentCompleteLayout"
        android:layout_marginTop="2dp"
        android:layout_marginBottom="2dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Completion"
            android:padding="5dp"
            android:textColor="@color/black"
            android:textSize="15sp"/>
        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/percentComplete"
            android:layout_marginBottom="1dp"/>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#c0c0c0"
        android:layout_below="@id/percentCompleteLayout"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/extra_homework_info"
        android:hint="Extra Infomation"
        android:textSize="16sp"
        android:layout_below="@id/percentCompleteLayout"
        android:layout_alignParentStart="true"
        android:layout_marginTop="2dp"
        android:padding="5dp"
        android:background="@null" />

</RelativeLayout>

spinner_layout.xml *

<?xml version="1.0" encoding="utf-8"?>

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:gravity="left"
    android:padding="5dip"
    android:textColor="@android:color/black"
    android:background="@android:color/transparent"
    />

我想知道是否有办法解决这个问题并让微调器显示默认/用户选择。如果您需要更多代码,可以在GitHub中找到所有代码。提前感谢所有答案!

1 个答案:

答案 0 :(得分:0)

解决方案:尝试在开始活动之前加载类,例如在MainActivity中。然后通过意图传递值。

示例: MainActivty.java

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Launch Add Homework Activity
            Intent intent = new Intent(MainActivity.this, addAssignment.class);
            intent.putExtra("classListNames", classListNames);
            startActivity(intent);
...
        classDb.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                classList.clear();
                for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                    Classes mClass = userSnapshot.getValue(Classes.class);
                    Log.i(TAG, "Class loaded: " + mClass.getClassName());
                    classList.add(mClass);
                    classListNames.add(mClass.getClassName());
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.e(TAG, "Error: " + databaseError.getMessage());
            }
        });

addAssignment.java

// Gets class list
    Bundle extras = getIntent().getExtras();
    classListNames = extras.getStringArrayList("classListNames");
...
        mDueClass = (Spinner) findViewById(R.id.class_spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, classListNames);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        mDueClass.setAdapter(adapter);

原因:经过一些调试后,我发现问题的原因是时间差异。应用程序将请求发送类,创建微调器,然后加载类。时间上的差异是毫秒,但足以引起问题。