【问题标题】:Filtering Json to show only the results the user wants过滤 Json 以仅显示用户想要的结果
【发布时间】:2017-04-02 04:35:03
【问题描述】:

在我的应用程序中,我可以获取 json 中的数据并将其显示在列表视图上就好了,但现在我想要过滤,我想要基于每个 json 对象“estado”的字段的 3 个不同的过滤器。

我在操作栏上有一个菜单,用户可以在其中单击过滤器。

我的方法:

对于每个菜单项,我使用android:onClick="doC" 执行了一个函数,每个菜单项都将整数“s”的值更改为 1、2 或 3,因此 AsyncTask 获取此数字并执行不同的任务以进行过滤。

 public void doC(MenuItem item){
        Toast.makeText(this, "Concluidas", Toast.LENGTH_LONG).show();
        s = 1;
        new GetObras().execute();
    }

    public void doA(MenuItem item){
        Toast.makeText(this, "Aguardam Aprovação", Toast.LENGTH_LONG).show();
        s = 2;
    }

    public void doR(MenuItem item){
        Toast.makeText(this, "Recusadas", Toast.LENGTH_LONG).show();
        s = 3;
}

为了接收,我将函数签名更改为:

protected Void doInBackground(Integer... integers) {

然后在 doInBackground 我有:

if (s == 0) {
// do this
if (s == 1) {
//do this
}

我没有收到任何错误,但在我点击过滤器后,他会显示进度动画,但列表视图中没有任何变化。

完整代码:

public class MainActivity extends ActionBarActivity implements SearchView.OnQueryTextListener{

    private String TAG = MainActivity.class.getSimpleName();
    private ProgressDialog pDialog;
    private ListView list;
    int s;

    private static String url = "http://ploran.gear.host/scriptobras6.php";

    ArrayList<HashMap<String, String>> obrasList;
    ArrayList<HashMap<String, String>> concluidasList;


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

        obrasList = new ArrayList<HashMap<String, String>>();
        concluidasList = new ArrayList<HashMap<String, String>>();
        list = (ListView)findViewById(R.id.list1);

        new GetObras().execute();

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                                    long id) {
                Log.e("item clicks", "selected: " + position);

                Intent intent = new Intent (MainActivity.this, DetailsActivity.class);
                intent.putExtra("id", obrasList.get(position).get("Id"));
                intent.putExtra("nomeobra", obrasList.get(position).get("nomeObra"));
                intent.putExtra("idCliente", obrasList.get(position).get("idCliente"));
                intent.putExtra("dataplevantamento", obrasList.get(position).get("DataLevantamento"));
                intent.putExtra("datarlevantamento", obrasList.get(position).get("DataRealizacao"));
                intent.putExtra("estado", obrasList.get(position).get("Estado"));
                intent.putExtra("DataRMateriais", obrasList.get(position).get("DataRMateriais"));
                intent.putExtra("DataInicioObra", obrasList.get(position).get("DataInicioObra"));
                intent.putExtra("DataConclusao", obrasList.get(position).get("DataConclusao"));
                intent.putExtra("DataVestoria\"", obrasList.get(position).get("DataVestoria"));
                intent.putExtra("Obs", obrasList.get(position).get("Obs"));
                intent.putExtra("Prompor", obrasList.get(position).get("Prompor"));
                intent.putExtra("Levantpor", obrasList.get(position).get("Levantpor"));
                intent.putExtra("executpor", obrasList.get(position).get("executpor"));
                startActivity(intent);
            }
        });
    }

    private class GetObras extends AsyncTask<Integer, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Por favor aguarde ...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Integer... integers) {
            HttpHandler sh = new HttpHandler();
            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url);
            Log.e(TAG, "Response from url: " + jsonStr);

            JSONArray obras = null;

            try {
                obras = new JSONArray(jsonStr);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            if (s == 0) {
                if (jsonStr != null) {
                    try {
                        //JSONObject jsonObj = new JSONObject(jsonStr);
                        // Getting JSON Array node
                        //JSONArray obras = jsonObj.getJSONArray("obras");

                        // looping through All
                        for (int i = 0; i < obras.length(); i++) {
                                JSONObject c = obras.getJSONObject(i);

                            String id = c.getString("Id");
                            String nomeObra = c.getString("NomeObra");
                            String idCliente = c.getString("idCliente");
                            String DataLevantamento = c.getString("DataPLevantamento");
                            String DataRealizacao = c.getString("DataRLevantamento");
                            String Estado = c.getString("Estado");
                            String DataMateriais = c.getString("DataRMateriais");
                            String DataInicioObra = c.getString("DataInicioObra");
                            String DataConclusao = c.getString("DataConclusao");
                            String DataVestoria = c.getString("DataVestoria");
                            String Obs = c.getString("Obs");
                            String Prompor = c.getString("Prompor");
                            String Levantpor = c.getString("Levantpor");
                            String executpor = c.getString("executpor");

                            // tmp hash map for single contact
                            HashMap<String, String> obra = new HashMap<>();

                            // adding each child node to HashMap key => value
                            obra.put("Id", id);
                            obra.put("nomeObra", nomeObra);
                            obra.put("idCliente", idCliente);
                            obra.put("DataLevantamento", DataLevantamento);
                            obra.put("DataRealizacao", DataRealizacao);
                            obra.put("Estado", Estado);
                            obra.put("DataMateriais", DataMateriais);
                            obra.put("DataIncioObra", DataInicioObra);
                            obra.put("DataConclusao", DataConclusao);
                            obra.put("DataVestoria", DataVestoria);
                            obra.put("Obs", Obs);
                            obra.put("Prompor", Prompor);
                            obra.put("Levantpor", Levantpor);
                            obra.put("executpor", executpor);

                            // adding contact to contact list
                            obrasList.add(obra);
                        }
                    } catch (final JSONException e) {
                        Log.e(TAG, "Json parsing error: " + e.getMessage());
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(),
                                        "Json parsing error: " + e.getMessage(),
                                        Toast.LENGTH_LONG)
                                        .show();

                            }
                        });

                    }
                } else {
                    Log.e(TAG, "Couldn't get json from server.");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Couldn't get json from server. Check LogCat for possible errors!",
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
                }
            }

            if ( s == 1) {
                JSONObject object = null;

                for (int i = 0; i < obras.length(); i++) {

                    try {
                        object = obras.getJSONObject(i);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    try {
                        if (object.getString("Estado") == "Obra Concluída") {
                            JSONObject c = obras.getJSONObject(i);

                            String id = c.getString("Id");
                            String nomeObra = c.getString("NomeObra");
                            String idCliente = c.getString("idCliente");
                            String DataLevantamento = c.getString("DataPLevantamento");
                            String DataRealizacao = c.getString("DataRLevantamento");
                            String Estado = c.getString("Estado");
                            String DataMateriais = c.getString("DataRMateriais");
                            String DataInicioObra = c.getString("DataInicioObra");
                            String DataConclusao = c.getString("DataConclusao");
                            String DataVestoria = c.getString("DataVestoria");
                            String Obs = c.getString("Obs");
                            String Prompor = c.getString("Prompor");
                            String Levantpor = c.getString("Levantpor");
                            String executpor = c.getString("executpor");

                            // tmp hash map for single contact
                            HashMap<String, String> obra = new HashMap<>();

                            // adding each child node to HashMap key => value
                            obra.put("Id", id);
                            obra.put("nomeObra", nomeObra);
                            obra.put("idCliente", idCliente);
                            obra.put("DataLevantamento", DataLevantamento);
                            obra.put("DataRealizacao", DataRealizacao);
                            obra.put("Estado", Estado);
                            obra.put("DataMateriais", DataMateriais);
                            obra.put("DataIncioObra", DataInicioObra);
                            obra.put("DataConclusao", DataConclusao);
                            obra.put("DataVestoria", DataVestoria);
                            obra.put("Obs", Obs);
                            obra.put("Prompor", Prompor);
                            obra.put("Levantpor", Levantpor);
                            obra.put("executpor", executpor);

                            // adding contact to contact list
                            obrasList.add(obra);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                }

            return null;
        }


            @Override
            protected void onPostExecute (Void result){

                    super.onPostExecute(result);
                    // Dismiss the progress dialog
                    if (pDialog.isShowing())
                        pDialog.dismiss();
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            MainActivity.this, obrasList,
                            R.layout.list_item, new String[]{"nomeObra", "idCliente",
                            "Estado"}, new int[]{R.id.name,
                            R.id.email, R.id.mobile});

                    list.setAdapter(adapter);

                    if(pDialog.isShowing()) { pDialog.hide(); }
                }
    }



    List<String> cities;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.options, menu);

        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        // User pressed the search button
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // User changed the text
        return false;
    }

    public void doC(MenuItem item){
        Toast.makeText(this, "Concluidas", Toast.LENGTH_LONG).show();
        s = 1;
        new GetObras().execute();
    }

    public void doA(MenuItem item){
        Toast.makeText(this, "Aguardam Aprovação", Toast.LENGTH_LONG).show();
        s = 2;
    }

    public void doR(MenuItem item){
        Toast.makeText(this, "Recusadas", Toast.LENGTH_LONG).show();
        s = 3;
    }
}

【问题讨论】:

    标签: java android json filter


    【解决方案1】:

    每次您从菜单中更改方法上的过滤器时,您都会更改过滤器的整数,但您不再调用 AsyncTask,请将 new GetObras().execute(); 放入 'doA'和'doR'

    【讨论】:

    • 使所有其他都像这样doC
    • 但我正在做 DOC,这是我首先要做的。
    • 试一试,告诉我们进展如何^^
    • 只有在获得异步任务的结果后才更新适配器的数据,如果您重新查询项目的方式是再次查询服务器,并且当您更改更改查询方式的整数时,您不会发送一个新的异步任务,它的逻辑是你没有看到变化,你没有要求它,它现在不工作很奇怪,你能展示你调用菜单点击的方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多