2017-01-18 3 views
1

Я создал счетчик, который принимает некоторые генерируемые пользователем строки (в моих классах классов - тип школы) и отображает их обычным способом spinner. Моя проблема возникает при попытке выбрать элемент из счетчика. Я могу нажать на spinner и выбрать класс, но прядильщик никогда не показывает, что у меня выбран класс. Прежде чем добавлять строки, созданные пользователем, у меня был XML-файл с строковым массивом, который работал отлично.Spinner не отображает выбранный или выбранный по умолчанию

Я попытался добавить 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. Спасибо заранее за все ответы!

+0

Попробуйте добавить: android: id = "@ android: id/text1", внутри вашего TextView из spinner_layout.xml. Надеюсь, это поможет! –

ответ

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); 

Причина: После некоторой отладки, я обнаружил причину проблемы, чтобы быть различия синхронизации. Приложение запросит отправку классов, создайте счетчик, , затем загрузите классы. Разница в сроках составила миллисекунды, но этого достаточно, чтобы вызвать проблему.