2016-11-22 22 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秒后弹出