Organizational Research By

Surprising Reserch Topic

listview is blank while using getfilter function


listview is blank while using getfilter function  using -'java,android,listview'

I am trying to implement the getFilter() function in my ListView but everytime I enter something in the EditText my ListView disappears.

My SetHelpRows file:

public class SetHelpRows {
    String name;
    String id;

    public String getName () {
        return name;
    }

    public void setName (String name) {
        this.name = name;
    }

    public String getID () {
        return id;
    }

    public void setID (String id) {
        this.id = id;
    }

    public SetHelpRows(String name, String id) {
        super();
        this.name = name;
        this.id = id;
    }
}


My SetHelpRowsCustomAdapter file:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> {
    Context context;
   int layoutResourceId;
   ArrayList<SetRows> data=new ArrayList<SetRows>();
   private ArrayList<SetRows> original;
   private ArrayList<SetRows> fitems;
   private Filter filter;


   public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) {
       super(context, layoutResourceId, data);
       this.layoutResourceId = layoutResourceId;
       this.context = context;
       this.data = data;

       this.original = data;//new ArrayList<Pkmn>();
       this.fitems = data;//new ArrayList<Pkmn>();
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       ImageHolder holder = null;

       if(row == null)
       {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           row = inflater.inflate(layoutResourceId, parent, false);

           holder = new ImageHolder();
           holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
           holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
           holder.txtID = (TextView)row.findViewById(R.id.txtModDate);
           row.setTag(holder);
       }
       else
       {
           holder = (ImageHolder)row.getTag();
       }

       SetRows myImage = data.get(position);
       holder.txtTitle.setText(myImage.name);
       holder.txtID.setText(myImage.id);
       int outImage=myImage.image;
       holder.imgIcon.setImageResource(outImage);
      return row;

   }

   static class ImageHolder
   {
       ImageView imgIcon;
       TextView txtTitle;
       TextView txtID;
   }

   @Override
   public Filter getFilter()
   {
       if (filter == null) {
           Log.i("Before Filter", "Before Filter");
           filter = new PkmnNameFilter();
       }

       return filter;
   }

   private class PkmnNameFilter extends Filter
   {
           @Override
           protected FilterResults performFiltering(CharSequence constraint)
           {   
               FilterResults results = new FilterResults();
               String prefix = constraint.toString().toLowerCase();

               if (prefix == null || prefix.length() == 0)
               {
                   Log.i("prefix is null or 0", "prefix is null or 0");
                   ArrayList<SetRows> list = new ArrayList<SetRows>(original);
                   results.values = list;
                   results.count = list.size();
               }
               else
               {
                   Log.i("prefix is !null or !0", "prefix is !null or !0");
                   final ArrayList<SetRows> list = new ArrayList<SetRows>(original);
                   final ArrayList<SetRows> nlist = new ArrayList<SetRows>();
                   int count = list.size();

                   for (int i=0; i<count; i++)
                   {
                       final SetRows pkmn = list.get(i);
                       final String value = pkmn.getName().toLowerCase();

                       if (value.startsWith(prefix))
                       {
                           nlist.add(pkmn);
                       }
                   }
                   results.values = nlist;
                   results.count = nlist.size();
               }
               return results;
           }

           @SuppressWarnings("unchecked")
           @Override
           protected void publishResults(CharSequence constraint, FilterResults results) {

               Log.i("publish result", "publish result");
               fitems = (ArrayList<SetRows>)results.values;

               clear();
               int count = fitems.size();
               for (int i=0; i<count; i++)
               {
                   SetRows pkmn = (SetRows)fitems.get(i);
                   add(pkmn);
               }
           }

       }
}


My partial MainActivity file:

inputSearch = (EditText) findViewById(R.id.etSearch);
dataList = (ListView) findViewById(R.id.lvFiles);
for (int y=0; y<strNames.length;y++) {
    name = strNamesOfAllah[y];
    meaning = strMeaning[y];
    rowsArray.add(new SetRows(R.drawable.icon, name, meaning));
}
adapter = new SetRowsCustomAdapter(MainActivity.this, R.layout.customlist, rowsArray);
dataList.setAdapter(adapter);
dataList.setClickable(true);
inputSearch.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        // When user changed the Text
        //MainActivity.this.adapter.getFilter().filter(cs);
        //String text = inputSearch.getText().toString().toLowerCase();
        adapter.getFilter().filter(cs.toString().toLowerCase(Locale.US));
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        //TODO Auto-generated method stub
    }

    @Override
    public void afterTextChanged(Editable arg0) {
        //TODO Auto-generated method stub                         
    }
});


In the LogCat I do see the following:

12-12 12:15:57.077: I/Before Filter(720): Before Filter
12-12 12:15:57.106: I/prefix is !null or !0(720): prefix is !null or !0
12-12 12:15:57.216: I/publish result(720): publish result

    

asked Sep 29, 2015 by akasati02
0 votes
4 views



Related Hot Questions

3 Answers

0 votes

I modified my code and was able to get it to work. If anyone wants to use it, be my guest :)

SetRows Java file:

public class SetRows {
    int image;
    String name;
    String id;

    public int getImage () {
        return image;
    }

    public void setImage (int image) {
        this.image = image;
    }

    public String getName () {
        return name;
    }

    public void setName (String name) {
        this.name = name;
    }

    public String getID () {
        return id;
    }

    public void setID (String id) {
        this.id = id;
    }

    public SetRows(int image, String name, String id) {
        super();
        this.image = image;
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return  image + " " + name + " " + id;
    }
}

SetRowsCustomAdapter Java file:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter {
    Context context;
   int layoutResourceId;
   ArrayList data=new ArrayList(); //data = countryList
   private ArrayList originalList;
   private NameFilter filter;

   public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList data) {
       super(context, layoutResourceId, data);
       this.layoutResourceId = layoutResourceId;
       this.context = context;

       this.data = data;
       //this.data.addAll(data);

       this.originalList = new ArrayList();
       this.originalList.addAll(data);
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       ImageHolder holder = null;

       if(row == null)
       {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           row = inflater.inflate(layoutResourceId, parent, false);

           holder = new ImageHolder();
           holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
           holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
           holder.txtID = (TextView)row.findViewById(R.id.txtModDate);
           row.setTag(holder);
       }
       else
       {
           holder = (ImageHolder)row.getTag();
       }

       SetRows myImage = data.get(position);
       holder.txtTitle.setText(myImage.name);
       holder.txtID.setText(myImage.id);
       int outImage=myImage.image;
       holder.imgIcon.setImageResource(outImage);
      return row;

   }

   static class ImageHolder
   {
       ImageView imgIcon;
       TextView txtTitle;
       TextView txtID;
   }
   @Override
   public Filter getFilter() {
    if (filter == null){
     filter  = new NameFilter();
    }
    return filter;
   }
   private class NameFilter extends Filter
   {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

     constraint = constraint.toString().toLowerCase();
     FilterResults result = new FilterResults();
     if(constraint != null && constraint.toString().length() > 0)
     {
     ArrayList filteredItems = new ArrayList();

     for(int i = 0, l = originalList.size(); i < l; i++)
     {
      SetRows nameList = originalList.get(i);
      if(nameList.toString().toLowerCase().contains(constraint))
       filteredItems.add(nameList);
     }
     result.count = filteredItems.size();
     result.values = filteredItems;
     }
     else
     {
      synchronized(this)
      {
       result.values = originalList;
       result.count = originalList.size();
      }
     }
     return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
      FilterResults results) {

     data = (ArrayList)results.values;
     notifyDataSetChanged();
     clear();
     for(int i = 0, l = data.size(); i < l; i++)
      add(data.get(i));
     notifyDataSetInvalidated();
    }
   }
}

Everything else stayed the same :)

I hope people find it useful for their own app.

answered Sep 29, 2015 by sanjaypal1983
0 votes

You don't need to implement your own Filter, if you are using an ArrayAdapter you can just override the toString method in SetHelpRows to return the name. Then you can call the ArrayAdapters built-in Filter.

This is not a direct answer to your question but rather a suggestion to change your implementation.

answered Sep 29, 2015 by devkumargupta
0 votes

please try this in your publishResults function

               @Override
               protected void publishResults(CharSequence constraint, FilterResults results) {

                   Log.i("publish result", "publish result");
                   data = (ArrayList)results.values;
                   notifyDataSetChanged();

               }
answered Sep 29, 2015 by gauravg.gwl

...