Android Spinner - 刷新后阻止关闭

时间:2016-11-22 03:16:45

标签: java android spinner android-spinner

我有一个显示项目列表的下拉微调器,此列表在收到API响应后每隔X秒更新一次。

问题是当列表更新时,微调器会自动关闭。我希望它在刷新后保持打开状态。

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

2 个答案:

答案 0 :(得分:2)

这是一个演示,展示如何在保持打开的同时更新Spinner

首先使用Spinner设置adapter来初始化setAdapter

然后更新项目。我使用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();
}

答案 1 :(得分: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秒后没有关闭弹出窗口
相关问题