如何根据 JSON 数据和过滤参数过滤列表视图?

Posted

技术标签:

【中文标题】如何根据 JSON 数据和过滤参数过滤列表视图?【英文标题】:How to filter a list view based on JSON data and filter parameters? 【发布时间】:2015-10-02 22:07:56 【问题描述】:

我正在尝试在 android 中创建一个带有过滤器的ListView

我们有两个下拉菜单,角色性别,以及一个搜索按钮。

当用户单击搜索按钮时,我只想显示与所选下拉值相关的数据。

例如,如果我分别从“角色”和“性别”中选择“工程师”和“男性”,那么它应该只显示“角色”中有工程师和“性别”中有男性的数据。

从以下 JSON 文件中,应该显示的唯一记录是“BHARGAV”。

 
"contacts": [
    
            "id": "c200",
            "name": "Bhargav",
            "email": "ab@gmail.com",
            "address": "xx-xx-xxxx,x - street, x - country",
            "gender" : "male",
            "role" : "Engineer",
            "phone": 
                "mobile": "+91 0000000000",
                "home": "00 000000",
                "office": "00 000000"
            
    ,
    
            "id": "c201",
            "name": "Johnny",
            "email": "johnny@gmail.com",
            "address": "xx-xx-xxxx,x - street, x - country",
            "gender" : "female",
            "role" : "CharteredAccountant",
            "phone": 
                "mobile": "+91 0000000000",
                "home": "00 000000",
                "office": "00 000000"
            
    ,
    
            "id": "c202",
            "name": "Leonardo Dicaprio",
            "email": "leonardo_dicaprio@gmail.com",
            "address": "xx-xx-xxxx,x - street, x - country",
            "gender" : "male",
            "role" : "Doctor",
            "phone": 
                "mobile": "+91 0000000000",
                "home": "00 000000",
                "office": "00 000000"
            

           
   ]
   

这是我的代码

public class MainActivity extends ListActivity 

    private ProgressDialog pDialog;

    // URL to get contacts JSON
    private static String url = "http://api.examplesite.com/contacts/";

    // JSON Node names
    private static final String TAG_CONTACTS = "contacts";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_EMAIL = "email";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_GENDER = "gender";
    private static final String TAG_ROLE = "role";
    private static final String TAG_PHONE = "phone";
    private static final String TAG_PHONE_MOBILE = "mobile";
    private static final String TAG_PHONE_HOME = "home";
    private static final String TAG_PHONE_OFFICE = "office";

    // contacts JSONArray
    JSONArray contacts = null;

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList;

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

        contactList = new ArrayList<HashMap<String, String>>();

        ListView lv = getListView();

        // Listview on item click listener
        lv.setOnItemClickListener(new OnItemClickListener() 

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) 
                // getting values from selected ListItem
                String name = ((TextView) view.findViewById(R.id.name))
                        .getText().toString();
                String cost = ((TextView) view.findViewById(R.id.email))
                        .getText().toString();
                String description = ((TextView) view.findViewById(R.id.mobile))
                        .getText().toString();

                // Starting single contact activity
                Intent in = new Intent(getApplicationContext(),
                        SingleContactActivity.class);
                in.putExtra(TAG_NAME, name);
                in.putExtra(TAG_EMAIL, cost);
                in.putExtra(TAG_PHONE_MOBILE, description);
                startActivity(in);

            
        );

        // Calling async task to get json
        new GetContacts().execute();
    

    /**
     * Async task class to get json by making HTTP call
     * */
    private class GetContacts extends AsyncTask<Void, Void, Void> 

        @Override
        protected void onPreExecute() 
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        

        @Override
        protected Void doInBackground(Void... arg0) 
            // Creating service handler class instance
            ServiceHandler sh = new ServiceHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

            Log.d("Response: ", "> " + jsonStr);

            if (jsonStr != null) 
                try 
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    contacts = jsonObj.getJSONArray(TAG_CONTACTS);

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

                        String id = c.getString(TAG_ID);
                        String name = c.getString(TAG_NAME);
                        String email = c.getString(TAG_EMAIL);
                        String address = c.getString(TAG_ADDRESS);
                        String gender = c.getString(TAG_GENDER);
                        String role = c.getString(TAG_ROLE);

                        // Phone node is JSON Object
                        JSONObject phone = c.getJSONObject(TAG_PHONE);
                        String mobile = phone.getString(TAG_PHONE_MOBILE);
                        String home = phone.getString(TAG_PHONE_HOME);
                        String office = phone.getString(TAG_PHONE_OFFICE);

                        // tmp hashmap for single contact
                        HashMap<String, String> contact = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        contact.put(TAG_ID, id);
                        contact.put(TAG_NAME, name);
                        contact.put(TAG_EMAIL, email);
                        contact.put(TAG_PHONE_MOBILE, mobile);

                        // adding contact to contact list
                        contactList.add(contact);
                    
                 catch (JSONException e) 
                    e.printStackTrace();
                
             else 
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            

            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, contactList,
                    R.layout.list_item, new String[]  TAG_NAME, TAG_EMAIL,
                            TAG_PHONE_MOBILE , new int[]  R.id.name,
                            R.id.email, R.id.mobile );

            setListAdapter(adapter);
        

    


它没有按预期工作。

怎么了?我怎样才能正确地实现它?

【问题讨论】:

我不完全确定您想要实现什么目标以及您在这里无法做到什么。 我正在尝试从 JSON 文件中获取列表视图,但不是所有来自 JSON 文件的数据我只想要从 json 文件中选择的数据 我知道如何解析 JSON...这里我也有 listview 但我有所有数据的 listview 但我只想要选定的数据所以我该怎么做? 你让自己成为一个模型对象,只包含你想要的 JSON 文件中的数据,然后你解析你的 JSON(你也可以看看 GSON 库),然后你传递那个对象或列表对象到您的列表视图的适配器。 【参考方案1】:

您可以在 for 循环中设置 if 条件,从 JSON 中获取所有数据并在适配器中设置,如下所示...

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

                if(c.getString(TAG_GENDER).equalsIgnoreCase((String) Role.getSelectedItem()) &&  c.getString(TAG_ROLE).equalsIgnoreCase((String) Gender.getSelectedItem())) 

                String id = c.getString(TAG_ID);
                String name = c.getString(TAG_NAME);
                String email = c.getString(TAG_EMAIL);
                String address = c.getString(TAG_ADDRESS);
                String gender = c.getString(TAG_GENDER);
                String role = c.getString(TAG_ROLE);

                // Phone node is JSON Object
                JSONObject phone = c.getJSONObject(TAG_PHONE);
                String mobile = phone.getString(TAG_PHONE_MOBILE);
                String home = phone.getString(TAG_PHONE_HOME);
                String office = phone.getString(TAG_PHONE_OFFICE);

                // tmp hashmap for single contact
                HashMap<String, String> contact = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                contact.put(TAG_ID, id);
                contact.put(TAG_NAME, name);
                contact.put(TAG_EMAIL, email);
                contact.put(TAG_PHONE_MOBILE, mobile);

                // adding contact to contact list
                contactList.add(contact);

                
            

【讨论】:

【参考方案2】:

从服务器获取所有数据并填写contactListlist 后,您需要将数据与用户给定的条件进行比较。 简单地迭代 contactList 并检查用户给定的值

检查下面的伪代码

ArrayList<HashMap<String, String>> finalList = new ArrayList<HashMap<String, String>>();

for (int i = 0; i < contactList.length(); i++) 
HashMap<String, String> map = contactList.get(i);
if(map.TAG_NAME == "BHARGAV"  && map.TAG_GENDER == "MALE")
finalList.add(map);

现在使用这个 'finalList' 来显示值

提示:创建模型/自定义类来保存数据比 Hashmap 更好。

【讨论】:

以上是关于如何根据 JSON 数据和过滤参数过滤列表视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将模型数据加载到在 Yii 中使用 Ajax 过滤的 Select2 下拉列表

根据多个下拉过滤获取数据值

vba,如何从列表框中的工作表中删除过滤后的数据

Swift:在表格视图中过滤结果,因此它不会从 JSON 返回重复项

如何根据文本框值过滤列表框值

使用全文搜索和其他条件搜索1300万条记录