【问题标题】:Android: Update ArrayAdapter outside of onCreate() methodAndroid:在 onCreate() 方法之外更新 ArrayAdapter
【发布时间】:2018-04-14 12:04:59
【问题描述】:

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

在 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();
    }

如您所见,我尝试了不同的方法,例如 addAll() 和 notifyDataSetChanged(),但我不确定我是否正确使用了这些方法。

我想做的事情是用 AsyncTask 返回的数组的内容填充 MaterialDesignSpinner,如果有人知道任何其他选项,我会感谢任何建议,谢谢,任何帮助都会被感谢!

【问题讨论】:

  • 究竟什么是“它不起作用”?您预计会发生什么和不会发生什么?

标签: android android-asynctask android-arrayadapter


【解决方案1】:

首先你不应该将带有 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();

【讨论】:

    【解决方案2】:
     public static void updateAdapter(String[] result) {
    
             arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, result);
         materialDesignSpinner.setAdapter(arrayAdapter);
        }
    

    试试上面的代码

    【讨论】:

      【解决方案3】:

      没有一个答案对我有用,但我终于找到了解决方案,我在这里发布以防有人需要它:

      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);
      }
      

      非常感谢您的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多