【问题标题】:Update adapter Spinner from response json with Async task使用异步任务从响应 json 更新适配器 Spinner
【发布时间】:2014-11-10 08:14:30
【问题描述】:

如何从数据 json 更新微调器? 示例微调器 B 仅检索类别“ket”的数据,响应 json 已转换为 arraylist,但我无法从 json 更新 1 个数组的适配器微调器

// EXAMPLE JSON

[{"kode":"I5","hrg":5700,"nom":"5000","ket":"IM3 REG 5000"},{"kode":"ISG5","hrg":5700,"nom":"5000","ket":"IM3 GPRS ALTERNATIF 5000"},{"kode":"ISS5","hrg":5700,"nom":"5000","ket":"IM3 SMS ALTERNATIF 5000"},{"kode":"IS5","hrg":5700,"nom":"5000","ket":"IM3 REG ALTERNATIF 5000"},{"kode":"I5S","hrg":5700,"nom":"5000","ket":"IM3 SMS 5000"},{"kode":"ITG5","hrg":5700,"nom":"5000","ket":"IM3 GPRS 5000"},{"kode":"ITG10","hrg":10700,"nom":"10000","ket":"IM3 GPRS 10000"},{"kode":"I10","hrg":10700,"nom":"10000","ket":"IM3 10000"},{"kode":"I10S","hrg":10700,"nom":"10000","ket":"IM3 SMS 250 10000"},{"kode":"IS10","hrg":10700,"nom":"10000","ket":"IM3 REG ALTERNATIF 10000"},{"kode":"ISG10","hrg":10700,"nom":"10000","ket":"IM3 GPRS ALTERNATIF 10000"},{"kode":"ISS10","hrg":10700,"nom":"10000","ket":"IM3 SMS ALTERNATIF 10000"},{"kode":"I20","hrg":20400,"nom":"20000","ket":"IM3 REG 20000"},{"kode":"I25","hrg":25200,"nom":"25000","ket":"IM3 25000"},{"kode":"I25S","hrg":25400,"nom":"25000","ket":"IM3 SMS 1667 25000"},{"kode":"ITG25","hrg":25400,"nom":"25000","ket":"IM3 GPRS 25000"},{"kode":"I30","hrg":30400,"nom":"30000","ket":"IM3 REG 30000"},{"kode":"I50","hrg":49425,"nom":"50000","ket":"IM3 50000"},{"kode":"I100","hrg":98500,"nom":"100000","ket":"IM3 100000"}]}

// GET JSON TO LIST
private static ArrayList<DataVoucher> processResponse(String response) {
    ArrayList<DataVoucher> listdata = new ArrayList<DataVoucher>();
    try {
        JSONArray jsonArray = new JSONArray(response);
        Log.d(TAG, "data lengt: " + jsonArray.length());
        DataVoucher dataVoucher = null;
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject obj = jsonArray.getJSONObject(i);
            dataVoucher = new DataVoucher();
            // dataVoucher.setKodeVoucher(obj.getString("kode"));
            // dataVoucher.setHrgVoucher(obj.getString("hrg"));
            // dataVoucher.setNomVoucher(obj.getString("nom"));
            dataVoucher.setKetVoucher(obj.getString("ket"));
            listdata.add(dataVoucher);
        }
    } catch (JSONException e) {
        Log.d(TAG, e.getMessage());
    }
    return listdata;
}

// SENT POST TO SERVER
public static void requestDataVoucher(final String operator) {
    Thread thread = new Thread() {
        public void run() {
            Looper.prepare();
            final String TAG = "SEND JSON";
            JSONObject jsonObjSend = new JSONObject();

            try {
                jsonObjSend.put("type", "svoc");
                jsonObjSend.put("hp", "089631633614");
                jsonObjSend.put("opr", operator);

                Log.i(TAG, jsonObjSend.toString(2));

            } catch (JSONException e) {
                e.printStackTrace();
            }

            // Send the HttpPostRequest and receive a JSONObject in return
            JSONObject jsonObjRecv = SendHttpPost(jsonObjSend);
            Looper.loop();
        }
    };
    thread.start();
}

// ASYNTASK update spinner
private class MainActivityAsync extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("retrieving...");
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... values) {
        /** send post from list spinner A */
        requestDataVoucher(pilihOperator.getSelectedItem().toString());
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                populateSpinnerVoucher();
            }
        });
    }
}

private void populateSpinnerVoucher() {
    adapter = new ArrayAdapter<DataVoucher>(this,
            android.R.layout.simple_spinner_item, list);
    adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    pilihVoucher.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

【问题讨论】:

    标签: android json android-asynctask


    【解决方案1】:

    我认为您忘记将项目添加到 list。看看:

    adapter = new ArrayAdapter<DataVoucher>(this,
                android.R.layout.simple_spinner_item, list);
    

    您将list 用于adapter,但是您在哪里将项目插入到列表中?或许您应该在onBackground 中执行此操作。

    并且在onPostExecute中不需要使用runOnUiThread,因为onPostExecute已经在UI线程上执行了代码。

    【讨论】:

    • 我放入内部类的项目列表,我刚刚编辑了我的问题以包含方法列表
    • 我把 processResponse(resultString) 放在 httprequest 中
    • 我已经将列表放到了背景上,但是却报错,错误是“MainActivity 已经泄露了窗口......原来是在这里添加的”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多