我有一个onCreate方法,在这个方法中,我用一个空字符串数组创建一个ArrayAdapter,然后调用一个AsyncTask,它返回一个字符串数组,我想用它来更新ArrayAdapter,但是我这样做是行不通的:
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);
}
}在onPostExecute(String[] result)方法的AsyncTask中,我调用updateAdapter(String[]结果)函数:
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();
}如您所见,我尝试过不同的方法,如addAll()和notifyDataSetChanged(),但我不确定是否正确地使用了这些方法。
我想要做的是用MaterialDesignSpinner返回的数组的内容填充AsyncTask,如果有人知道任何其他选项,我会接受任何建议,谢谢,任何帮助都会被接受!
发布于 2018-04-14 16:27:48
所有的答案都没有提供给我,但我终于找到了一个解决办法,我把它放在这里,以防有人需要它:
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);
}非常感谢你的帮助!
发布于 2018-04-14 12:45:14
首先,您不应该将包含空对象的数组设置为数组适配器,这会导致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();发布于 2018-04-14 13:04:24
public static void updateAdapter(String[] result) {
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, result);
materialDesignSpinner.setAdapter(arrayAdapter);
}试试上面的代码
https://stackoverflow.com/questions/49831242
复制相似问题