2017-12-27 13 views
3

notifyDataSetChanged()を呼び出してスピナービューを更新しようとしています。しかし、それは更新していません。android:notifyDataSetChanged()が呼び出されたときにスピナーが更新されない

以下の私の活動です:

public class DisplayArchive2 extends AppCompatActivity { 
    List<String> yearslist; 
    Spinner spinner; 
    ArrayAdapter<String> dataAdapter; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.archive2); 
     spinner = (Spinner) findViewById(R.id.year_spinner); 
     yearslist = new ArrayList<String>(); 
     yearslist.add("2017"); 
     yearslist.add("2016"); 
     yearslist.add("2015"); 
     yearslist.add("2014"); 
     yearslist.add("2013"); 

     dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,yearslist); 
     dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(dataAdapter); 
     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       yearslist.clear(); 
       yearslist.add("2010"); 
       yearslist.add("2009"); 
       yearslist.add("2008"); 
       yearslist.add("2007"); 
       yearslist.add("2006"); 
       dataAdapter.notifyDataSetChanged(); 
      } 

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

      } 
     }); 

    } 
} 

年のリストは、任意の年の選択に変更されていません。

それは次のようになります

enter image description here

+0

データセットを変更する必要がある場合、アダプタをスピナーにリセットしようとします。 – hornet2319

答えて

0

この使用してみてください下にdataAdapter2.setNotifyOnChange(true);その作業を私はそれを私のデバイス

void setNotifyOnChange (boolean notifyOnChange)

コントロールlist (add(T)を変更する方法かどうかをテストしている罰金、addAll(Collection),addAll(Object[]),insert(T, int),remove(T),clear(),sort(Comparator))が自動的にnotifyDataSetChanged()と呼びます。 falseに設定すると、発信者は手動でnotifyDataSetChanged()を呼び出して、変更を添付ビューに反映させる必要があります。デフォルトはtrueで、notifyDataSetChanged()を呼び出すと、フラグがtrueにリセットされます。私の理解あたりとして

CODE

List<String> yearslist; 
    Spinner spinner; 
    ArrayAdapter<String> dataAdapter2; 

    spinner = (Spinner) findViewById(R.id.year_spinner); 
     yearslist = new ArrayList<String>(); 
     yearslist.add("2017"); 
     yearslist.add("2016"); 
     yearslist.add("2015"); 
     yearslist.add("2014"); 
     yearslist.add("2013"); 



      dataAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,yearslist); 
      dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      spinner.setAdapter(dataAdapter2); 
      spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      if (position == 0) { 

      } else { 
       yearslist.clear(); 
       yearslist.add("2010"); 
       yearslist.add("2009"); 
       yearslist.add("2008"); 
       yearslist.add("2007"); 
       yearslist.add("2006"); 
       dataAdapter2.setNotifyOnChange(true); 
       dataAdapter.notifyDataSetChanged(); 
      } 

     } 

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

     } 
    }); 
+0

したがって、2つのアダプタがありますか?それはハッキーな解決策のように見える – rafid059

+0

@ rafid059そのただ1つのアダプタ私のフリンジ –

+1

次にタイプインには 'dataAdapter.notifyDataSetChanged();' – rafid059

0

。あなたはonItemSelected()の中のアダプターに通知しています。 Spinnerアダプタ初期化の場合、onItemSelected()は最初に一度呼び出されます。 Spinnerに登録するリストは常に新しいもの(つまり、2006-2010)で、最初のものではない(つまり2013-2017)。
他のアクションでアダプタに通知したり、onItemSelected()への最初の呼び出しを避けると、コードは正常に動作します。

+0

この問題が発生している別の場所に見つかりました。しかし、ここでは問題がない。それはまた非常に混乱している。時にはonItemSelected()のコードをその時に実行し、ときどき実行しないこともあります。 –

+0

まあ、あなたのスピナーに(2013-2017)リストを得る方法はまだ驚いています。私はあなたのコードをテストして、それは常にドキュメントごとに完璧な新しいリストを表示します。 – ADM

+0

私はAndroid 2.2.2とAndroid SDKのバージョン23.0.1を使用しており、SDKのバージョンはAPI 23です。ファイル>プロジェクトの構造から取得しました –

関連する問題