android:调用 notifyDataSetChanged() 时微调器未更新我的视图
android: spinner not updating my view when notifyDataSetChanged() is called
我正在尝试通过调用 notifyDataSetChanged()
来更新微调器视图。但它没有更新。
下面是我的Activity:
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) {
}
});
}
}
年份列表在选择任何年份时都不会改变。
看起来像下面
尝试使用 dataAdapter2.setNotifyOnChange(true);
它工作正常我已经测试过我的设备
void setNotifyOnChange (boolean notifyOnChange)
Control whether methods that change the list (add(T)
, addAll(Collection)
, addAll(Object[])
, insert(T, int)
, remove(T)
, clear()
, sort(Comparator))
automatically call notifyDataSetChanged()
. If set to false, caller must manually call notifyDataSetChanged()
to have the changes reflected in the attached view. The default is true, and calling notifyDataSetChanged()
resets the flag to 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) {
}
});
据我了解。您正在通知 onItemSelected()
内的适配器。在 Spinner 适配器初始化的情况下,onItemSelected() 将第一次被调用一次。因此,您将在 Spinner 中获得的列表始终是新的(即 2006-2010),而不是第一个(即 2013-2017)。
因此,如果您在某些其他操作上通知适配器,或者可能避免第一次调用 onItemSelected()
,您的代码将正常工作。
我正在尝试通过调用 notifyDataSetChanged()
来更新微调器视图。但它没有更新。
下面是我的Activity:
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) {
}
});
}
}
年份列表在选择任何年份时都不会改变。
看起来像下面
尝试使用 dataAdapter2.setNotifyOnChange(true);
它工作正常我已经测试过我的设备
void setNotifyOnChange (boolean notifyOnChange)
Control whether methods that change the
list (add(T)
,addAll(Collection)
,addAll(Object[])
,insert(T, int)
,remove(T)
,clear()
,sort(Comparator))
automatically callnotifyDataSetChanged()
. If set to false, caller must manually callnotifyDataSetChanged()
to have the changes reflected in the attached view. The default is true, and callingnotifyDataSetChanged()
resets the flag to 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) {
}
});
据我了解。您正在通知 onItemSelected()
内的适配器。在 Spinner 适配器初始化的情况下,onItemSelected() 将第一次被调用一次。因此,您将在 Spinner 中获得的列表始终是新的(即 2006-2010),而不是第一个(即 2013-2017)。
因此,如果您在某些其他操作上通知适配器,或者可能避免第一次调用 onItemSelected()
,您的代码将正常工作。