2017-09-17 17 views
1

データベースからArrayListにデータを取得していますが、これを使用してSpinnerを設定しています。
これはすべて正常に動作し、ドロップダウンリストに項目が表示されます。選択したアイテムをスピナーに設定できません

ただし、mySpinner.setSelected(INDEX)を使用していますが、選択した項目は表示されません。
私はsetOnItemSelectedListenerのコードを実行していません。

すでに多くの類似の質問があることを認識していますが、これらの回答をクロールしても問題を解決できませんでした。

私のコードは以下の通りです。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_add_man_data, container, false); 

    // Create the variables 
    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    final DatabaseReference ref = database.getReference(); 
    final ArrayList<String> statesForSpinner = new ArrayList<>(); 
    final TextView txtView = v.findViewById(R.id.add_man_data_txtview_1); 

    // Retrieve the database data (This bit works fine) 
    ref.child("stateDescriptions").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      int length = (int)dataSnapshot.getChildrenCount(); 

      for(int i = 0;i<length;i++) { 
       statesForSpinner.add(dataSnapshot.child(Integer.toString(i)).getValue(String.class)); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    // Create the spinner (This also works) 
    final Spinner stateSpinner = v.findViewById(R.id.state_spinner); 
    ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item, statesForSpinner); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    stateSpinner.setAdapter(adapter); 

    // But this does not work... Why? 
    stateSpinner.setSelection(1); 

    // And this never runs... Why? 
    stateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View v, int position, long id){ 
      stateSpinner.setSelection(position); 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> blah){ 

     } 
    }); 

    return v; 
} 
+0

の子を取得する必要があると思いますちょうどOnItemSelectedListener? –

+0

@KyleHigginsonそれはフラグメントなので、ビューを提供する必要があります。 –

+0

@Kyleそれは同じことです。 1つは、それを修飾する親クラスがあります –

答えて

0

あなたのアダプタがFirebase 非同期手あなたのデータまで

空であるかわりに、アダプタのArrayListに追加している、そしてそれは

を到着すると、新しいデータのアダプターを通知したことがありませんつまり、選択肢を設定するものは何もありません。実際には、リストが空であるため選択範囲を設定する際に範囲外の例外が発生すると思います。

アイテム選択リスナーがトリガーされますが、何かを選択する必要があります。しかし、もう一度、アダプターにリッスンできるデータがあることを通知していません。コードで


final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
final DatabaseReference ref = database.getReference(); 

final Spinner stateSpinner = v.findViewById(R.id.state_spinner); 

final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
stateSpinner.setAdapter(adapter); 

ref.child("stateDescriptions").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int length = (int)dataSnapshot.getChildrenCount(); 
     adapter.clear(); 
     for(int i = 0;i<length;i++) { 
      adapter.add(dataSnapshot.child(Integer.toString(i)).getValue(String.class)); 
     } 
     // For example, but this sets it back whenever data is added to Firebase 
     stateSpinner.setSelection(1); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     // TODO: Implement error handling 
    } 
}); 

stateSpinner.setOnItemSelectedListener(.... 

、理想的には、私はあなたがfor (DataSnapshot child : dataSnapshot.children())を使用してではなく、長さを取得し、その後、なぜあなたは代わりにAdapterView.OnItemSelectedListenerを使用している、その位置

関連する問題