Search code examples
androidlistviewandroid-arrayadapterlistadapter

Android How to display only certain items in list view from the same array?


I have been following several tutorials that have made me succeed in getting information from my database from my website to my app, then I can display it in a list view, but what I want to do is not show the complete list, I want to have a couple of buttons that let me display only the data that meets certain criteria, like bottom 1 only show list items that medio=Periodicos and button 2 show items that medio=Radios here is the code I'm using

in my main Activity

FancyAdapter aa = null;
static ArrayList<String> resultRow;

//after onCreate
//this button I'm usin now but I'm getting the hole list!
Button periodicos = (Button) findViewById(R.id.btnPeriodicos);
            periodicos.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                weballamar = "http://www.mysite.com/mydbjsonstring.php";
                webcall();
            }});

//webcall gets the info from the internet and displays the list
public void webcall(){
    ListView myListView = (ListView) findViewById(R.id.mylistView);
    aa = new FancyAdapter();
    myListView.setOnItemClickListener(onPeriodicosListClick);
    myListView.setAdapter(aa);
    PeriodicosListLayout.setVisibility(View.VISIBLE);
    webLayout.setVisibility(View.GONE);

    try {
        String result = "";
                    try {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(weballamar);
                        // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        InputStream webs = entity.getContent();
                        // convert response to string
                        try {
                            BufferedReader reader = new BufferedReader(
                                    new InputStreamReader(webs, "iso-8859-1"), 8);
                            StringBuilder sb = new StringBuilder();
                            String line = null;
                            while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                            }
                            webs.close();

                            result = sb.toString();
                        } catch (Exception e) {
                            Log.e("log_tag", "Error converting result " + e.toString());
                        }
                    } catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                    }

                    // parse json data
                    try {
                        JSONArray jArray = new JSONArray(result);
                        for (int i = 0; i < jArray.length(); i++) {
                            JSONObject json_data = jArray.getJSONObject(i);
                            webResult resultRow = new webResult();
                            resultRow._id = json_data.getString("id");
                            resultRow.Name = json_data.getString("Id_Nombre");
                            resultRow.Medio = json_data.getString("Medio");
                            resultRow.Pais = json_data.getString("Pais");
                            resultRow.Estado = json_data.getString("Estado");
                            resultRow.Ciudad = json_data.getString("Ciudad");
                            resultRow.website = json_data.getString("website");
                            resultRow.Url = json_data.getString("Url");
                            resultRow.Url2 = json_data.getString("Url2");
                            resultRow.InfAnex = json_data.getString("InfAnex");
                            arrayOfWebData.add(resultRow);
                        }
                    } catch (JSONException e) {
                        Log.e("log_tag", "Error parsing data " + e.toString());
                    }
    } catch (Exception e) {
        // this is the line of code that sends a real error message to the
        // log
        Log.e("ERROR", "ERROR IN CODE: " + e.toString());
        // this is the line that prints out the location in
        // the code where the error occurred.
        e.printStackTrace();
    }
}

class FancyAdapter extends ArrayAdapter<webResult> {
    FancyAdapter() {
        super(mainActivity.this,
                android.R.layout.simple_list_item_1, arrayOfWebData);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.listitem, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.populateFrom(arrayOfWebData.get(position));

        return (convertView);
    }
}

class ViewHolder {
    public TextView name = null;
    public TextView estado = null;
    public TextView ciudad = null;
    ViewHolder(View row) {
        name = (TextView) row.findViewById(R.id.periodicoName);
        estado = (TextView) row.findViewById(R.id.periodicoEstado);
        ciudad = (TextView) row.findViewById(R.id.periodicoCiudad);
    }

    void populateFrom(webResult r) {
        name.setText(r.Name);
        estado.setText(r.Estado);
        ciudad.setText(r.Ciudad);
    }
}

as you can see I' displaying the complete list of columns of names estates and cities in my list view, but that list contains items that in the medio column are either periodic or radio, so how can I make my adapter differentiate and choose to display only the ones witch medio=periodico, from there I might be able to do the opposite to pick the medio=radio Tahnks


Solution

  • Can't test this code, but here is something that might work

    1) Create another list that holds only the filtered items

    public ... ArrayList<webResult> FilteredArrayOfWebItems;
    

    2) Create a method in your adapter that lets you set the "type" (periodico or radio) String type;

    public void SetType(String type)
    { 
         /* Maybe something like this */
         //Clear the FilteredArrayOfWebItems first. Not on eclipse, at the moment, but I suspect FilteredArrayOfWebItems.clear() might be call you need
    
        for(JSONObject currentItem: arrayOfWebItems)
        {
            //Check if the Medio property of the current item matches the typ
            if(currentItem.Medio.equals(type))
            {
                //Add it to the Filtered list
                FilteredArrayOfWebItems.add(currentItem);
    
            }
         }
    

    }

    3) You may need to override the getCount() method to get the count of the filtered items, instead of the full list

    4) In your get View, read the information from the filtered list

    holder.populateFrom(FilteredArrayOfWebItems.get(position)); 
    

    5) From your main method call SetType whenever you want to change the filter

    6) From the main method, call adapter.notifyDataSetChanged() on the adapter after you've changed the filter