android:spinner在调用notifyDataSetChanged()时不更新我的视图

时间:2017-12-27 12:07:23

标签: android android-spinner

我正在尝试通过调用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

2 个答案:

答案 0 :(得分: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) {

        }
    });

答案 1 :(得分:0)

根据我的理解。您正在通知onItemSelected()内的适配器。如果Spinner适配器初始化onItemSelected()将首次调用一次。因此,您将在Spinner中获得的列表始终是新的(即2006-2010),而不是第一个(即2013-2017)。
因此,如果您确实通知了适配器的某些其他操作,或者可能避免第一次调用onItemSelected(),那么您的代码将正常工作。