【问题标题】:android: spinner not updating my view when notifyDataSetChanged() is calledandroid:调用 notifyDataSetChanged() 时微调器不更新我的视图
【发布时间】:2017-12-27 12:07:23
【问题描述】:

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

            }
        });

    }
}

选择任何年份时,年份列表都不会改变。

如下图

【问题讨论】:

  • 在需要更改数据集时尝试将适配器重置为微调器

标签: android android-spinner


【解决方案1】:

试试这个用法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。

代码

    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);
                dataAdapter2.notifyDataSetChanged();
            }

        }

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

        }
    });

【讨论】:

  • 那么,您有两个适配器吗?这看起来像一个 hacky 解决方案
  • 那这里有个错字dataAdapter.notifyDataSetChanged();
  • 另外,您正在创建和设置 dataAdapter2 两次
  • @EduardoHerzer 只是错误地复制粘贴代码
  • notifyDataSetChanged() 有什么用。很抱歉,有时我无法进入文档。或者何时使用 notifyDataSetChanged() 以及何时使用 setNotifyOnChange(true);因为当我使用 pageradapter 时,我使用了 notifyDataSetChanged
【解决方案2】:

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

【讨论】:

  • 我在另一个地方发现了这个问题。但在这里它没有问题。这也很混乱。有时它会暂时运行 onItemSelected() 中的代码,有时则不会。
  • 好吧,我仍然对您如何在微调器中获得 (2013-2017) 列表感到惊讶。我已经测试了你的代码,它总是显示根据文档完美的新列表。
  • 我使用的是 Android 2.2.2 和 Android SDK 版本 23.0.1,编译的 SDK 版本是 API 23。我从文件>项目结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多