Android:在onCreate()方法之外更新ArrayAdapter
我有一个onCreate方法,其中我创建了一个带有空字符串数组的ArrayAdapter,然后调用一个AsyncTask,返回一个字符串数组,我想用这个字符串数组更新ArrayAdapter,但我的方法不起作用:Android:在onCreate()方法之外更新ArrayAdapter,android,android-asynctask,android-arrayadapter,Android,Android Asynctask,Android Arrayadapter,我有一个onCreate方法,其中我创建了一个带有空字符串数组的ArrayAdapter,然后调用一个AsyncTask,返回一个字符串数组,我想用这个字符串数组更新ArrayAdapter,但我的方法不起作用: public class FillTransportPlaceActivity extends AppCompatActivity { public static String[] lines = new String[13]; public static Array
public class FillTransportPlaceActivity extends AppCompatActivity {
public static String[] lines = new String[13];
public static ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fill_transport_place);
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, lines);
new transportDB().execute(metroText); // AsyncTask method which return me the String[] array.
MaterialBetterSpinner materialDesignSpinner = findViewById(R.id.listLines);
materialDesignSpinner.setAdapter(arrayAdapter);
}
}
公共类FillTransportPlaceActivity扩展了AppCompatActivity{
公共静态字符串[]行=新字符串[13];
公共静态阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、活动、填充、运输、地点);
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple_下拉列表_项目_1行);
new transportDB().execute(metroText);//AsyncTask方法,该方法返回字符串[]数组。
MaterialBetterSpinner materialDesignSpinner=findViewById(R.id.listLines);
材料设计Spinner.setAdapter(阵列适配器);
}
}
在AsyncTask的onPostExecute(String[]result)方法中,我调用updateAdapter(String[]result)函数:
private class transportDB extends AsyncTask<String, String[], String[]> {
@Override
protected void onPreExecute() {
}
@Override
protected String[] doInBackground(String... strings) {
return DB_transportPlace.getLines(strings[0]);
}
@Override
protected void onPostExecute(String[] result) {
updateAdapter(result);
}
public static void updateAdapter(String[] result) {
for(int i = 0; i < 14; i++) {
arrayAdapter.add(result[i]);
}
//arrayAdapter.addAll(lines);
//arrayAdapter.notifyDataSetChanged();
}
私有类transportDB扩展异步任务{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的字符串[]doInBackground(字符串…字符串){
返回DB_transportPlace.getLines(字符串[0]);
}
@凌驾
受保护的void onPostExecute(字符串[]结果){
更新适配器(结果);
}
公共静态void updateAdapter(字符串[]结果){
对于(int i=0;i<14;i++){
arrayAdapter.add(结果[i]);
}
//arrayAdapter.addAll(行);
//arrayAdapter.notifyDataSetChanged();
}
如您所见,我尝试了不同的方法,如addAll()和notifyDataSetChanged(),但我不确定是否正确使用了这些方法
我想做的事情是用AsyncTask返回的数组内容填充MaterialDesignSpinner,如果有人知道任何其他选项,我将非常感谢您的建议,谢谢您,任何帮助都将非常感谢!首先,您不应该将带有null对象的数组设置为数组适配器,这将导致NullPointerException 您可以如下方式更新arrayAdapter:
sp = findViewById(R.id.someSpinner);
ArrayList<String> list = new ArrayList<>();
final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list);
sp.setAdapter(adapter);
list.add("Hello");
list.add("How are you");
adapter.notifyDataSetChanged();
sp=findViewById(R.id.someSpinner);
ArrayList=新建ArrayList();
最终ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u微调器\u项,列表);
sp.setAdapter(适配器);
添加(“你好”);
列表。添加(“你好”);
adapter.notifyDataSetChanged();
公共静态void updateAdapter(字符串[]结果){
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple\u下拉列表\u项目\u 1行,结果);
材料设计Spinner.setAdapter(阵列适配器);
}
尝试上面的代码没有一个答案可以提供给我,但我最终找到了一个解决方案,我将它发布在这里,以防有人需要它:
public class FillTransportPlaceActivity extends AppCompatActivity {
private ArrayList<String> list;
private ArrayAdapter<String> arrayAdapter;
private MaterialBetterSpinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fill_transport_place);
Toolbar tb = findViewById(R.id.toolbar_center);
setSupportActionBar(tb);
ActionBar ab = getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setHomeAsUpIndicator(R.drawable.ic_arrow_back);
list = new ArrayList<>();
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
spinner = findViewById(R.id.listLines);
SharedPreferences sp = getApplicationContext().getSharedPreferences("transportButton", 0);
boolean metro = sp.getBoolean("metro", false);
boolean bus = sp.getBoolean("bus", false);
if(metro) {
String metroText = "metro";
new transportDB().execute(metroText);
spinner.setAdapter(arrayAdapter);
} else {
if (bus) {
String busText = "bus";
new transportDB().execute(busText);
spinner.setAdapter(arrayAdapter);
}
}
}
}
public void updateAdapter(String[] result) {
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, result);
spinner.setAdapter(arrayAdapter);
}
公共类FillTransportPlaceActivity扩展了AppCompatActivity{
私有数组列表;
专用阵列适配器阵列适配器;
私人物料微调器微调器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、活动、填充、运输、地点);
工具栏tb=findViewById(R.id.Toolbar\U中心);
设置支持操作栏(tb);
ActionBar ab=getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(真);
ab.setHomeAsUpIndicator(R.drawable.ic箭头返回);
列表=新的ArrayList();
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple\u微调器\u项,列表);
微调器=findViewById(R.id.listLines);
SharedReferences sp=getApplicationContext().GetSharedReferences(“transportButton”,0);
布尔metro=sp.getBoolean(“metro”,false);
布尔总线=sp.getBoolean(“总线”,false);
国际单项体育联合会(地铁){
字符串metroText=“metro”;
新建transportDB().execute(metroText);
spinner.setAdapter(阵列适配器);
}否则{
国际单项体育联合会(巴士){
字符串busText=“总线”;
新建transportDB().execute(busText);
spinner.setAdapter(阵列适配器);
}
}
}
}
public void updateAdapter(字符串[]结果){
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple\u下拉列表\u项目\u 1行,结果);
spinner.setAdapter(阵列适配器);
}
非常感谢您的帮助!到底什么是“它不起作用”?您希望发生什么和没有发生什么?
public class FillTransportPlaceActivity extends AppCompatActivity {
private ArrayList<String> list;
private ArrayAdapter<String> arrayAdapter;
private MaterialBetterSpinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fill_transport_place);
Toolbar tb = findViewById(R.id.toolbar_center);
setSupportActionBar(tb);
ActionBar ab = getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setHomeAsUpIndicator(R.drawable.ic_arrow_back);
list = new ArrayList<>();
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
spinner = findViewById(R.id.listLines);
SharedPreferences sp = getApplicationContext().getSharedPreferences("transportButton", 0);
boolean metro = sp.getBoolean("metro", false);
boolean bus = sp.getBoolean("bus", false);
if(metro) {
String metroText = "metro";
new transportDB().execute(metroText);
spinner.setAdapter(arrayAdapter);
} else {
if (bus) {
String busText = "bus";
new transportDB().execute(busText);
spinner.setAdapter(arrayAdapter);
}
}
}
}
public void updateAdapter(String[] result) {
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, result);
spinner.setAdapter(arrayAdapter);
}