Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在onCreate()方法之外更新ArrayAdapter_Android_Android Asynctask_Android Arrayadapter - Fatal编程技术网

Android:在onCreate()方法之外更新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

我有一个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);
    }
}
公共类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);
}