2016-11-22 24 views
0

我有一個顯示項目列表的下拉微調器,此列表在接收到API響應後每隔X秒更新一次。Android微調器 - 刷新後禁止關閉

問題是,當列表更新時,微調器會自動關閉。我希望它在刷新後保持打開狀態。

private void getItems(JSONArray j){ 
    ArrayList<String> items = new ArrayList<>(); 

    for (int i=0; i < j.length(); i++){ 
     try { 
      //Getting json object 
      JSONObject json = j.getJSONObject(i); 

      //Adding the name of the student to array list 
      items.add(json.getString("name")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    spinner.setAdapter(new ArrayAdapter<>(BaseActivity.this, android.R.layout.simple_spinner_dropdown_item, items)); 
} 
+0

你能提供你的json數組字符串嗎? – HendraWD

+0

您正在重置適配器。我不認爲你可以保持下拉菜單打開 –

+0

只需添加spinner.performClick();在上面的代碼中設置適配器,如果它拋出錯誤,那麼你需要在主線程內寫入相同的行 – Vickyexpert

回答

2

這是一個演示,顯示如何在保持打開的同時更新Spinner

首先使用setAdapter設置adapter來初始化Spinner

然後對項目進行更新。我用Handler來模仿更新。在getItems方法的內部,而不是創建新的適配器(使用notifyDataSetChanged)來通知適配器數據集已更改。

下面的代碼。

private Spinner spinner; 
private ArrayAdapter<String> adapter; 
final List<String> items = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 

    initializeSpinner(); 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       String updatedItems = "[{\"name\" : \"test1\"}, {\"name\" : \"test2\"}, {\"name\" : \"test2\"}]"; 
       getItems(new JSONArray(updatedItems)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, 10000); 

} 


private void initializeSpinner() { 
    items.add("initial"); 

    spinner = (Spinner) findViewById(R.id.spinner); 
    adapter = new ArrayAdapter<String>(TestActivity.this, android.R.layout.simple_spinner_dropdown_item, items); 
    spinner.setAdapter(adapter); 
} 

private void getItems(JSONArray j) { 
    for (int i = 0; i < j.length(); i++) { 
     try { 
      //Getting json object 
      JSONObject json = j.getJSONObject(i); 

      //Adding the name of the student to array list 
      items.add(json.getString("name")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    adapter.notifyDataSetChanged(); 
} 
+0

所以我測試了你的代碼,它適用於我,我注意到當我在製作的應用程序中使用它時,仍然存在此問題。我將其縮小到導致問題的一行代碼:'testText.setText(「some string:」+ variable);'其中testText只是同一頁面上的一個textView。 問題是爲什麼更新runnable中的textview會關閉微調器? – FergusThePlant

+0

@FergusThePlant如果沒有看到代碼,我無法評論。請將它作爲一個不同的問題發佈,並將其鏈接發佈到此處, –

0

實際上,您只需要初始化並將適配器添加到微調器中。然後加載數據,將數據添加到適配器並調用adapter.notifyDataSetChanged();

這裏是我的測試活動,您可以直接複製粘貼到你的活動

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LinearLayout linearLayout = new LinearLayout(this); 
    linearLayout.setOrientation(LinearLayout.VERTICAL); 
    linearLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
    setContentView(linearLayout); 

    Spinner spinner = new Spinner(this); 
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, new ArrayList<String>()); 
    spinner.setAdapter(adapter); 

    Button button = new Button(this); 
    button.setText("load data"); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      TestActivity.this.getWindow().getDecorView().getHandler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        loadData(); 
       } 
      }, 2000); 
     } 
    }); 

    linearLayout.addView(spinner); 
    linearLayout.addView(button); 
} 

private void loadData() { 
    String jsonArray = "[\n" + 
      " {\n" + 
      " \"id\": \"1\",\n" + 
      " \"name\": \"dada1\"\n" + 
      " },\n" + 
      " {\n" + 
      " \"id\": \"2\",\n" + 
      " \"name\": \"dada2\"\n" + 
      " },\n" + 
      " {\n" + 
      " \"id\": \"3\",\n" + 
      " \"name\": \"dada3\"\n" + 
      " },\n" + 
      " {\n" + 
      " \"id\": \"4\",\n" + 
      " \"name\": \"dada4\"\n" + 
      " },\n" + 
      " \n" + 
      "]"; 
    try { 
     getItems(new JSONArray(jsonArray)); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

private ArrayAdapter<String> adapter; 

private void getItems(JSONArray j) { 
    ArrayList<String> items = new ArrayList<>(); 

    for (int i = 0; i < j.length(); i++) { 
     try { 
      //Getting json object 
      JSONObject json = j.getJSONObject(i); 

      //Adding the name of the student to array list 
      items.add(json.getString("name")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    adapter.addAll(items); 
    adapter.notifyDataSetChanged(); 
} 

如何檢驗呢?

  • 運行活動
  • 2秒鐘後,您的項目產生
  • 再次按下按鈕,該按鈕並按下微調立即
  • 您將看到的項目是不收加2秒後彈出