filtered listview is not maintained as adapter which is updating every seconds

44 Views Asked by At

I am able to filter listview using searchview which is working fine. My listview is updating every seconds for this handler is used to update the adapter.

private void nonstoprun() {

    handler = new Handler();
    update = new Runnable() {
        @Override
        public void run() {

            musers = (ArrayList<mobstat>) mobstat.listAll(mobstat.class);
            descAdapter = new DescAdapter(seconds.this, musers, seconds.this);
            contlist.setAdapter(descAdapter);// Notify our update
            handler.postDelayed(this , 1000);
           // android.widget.Filter filter = descAdapter.getFilter();
            //filter.filter(searchView.getQuery());


        }
    };
    handler.postDelayed(update, 10);

}

So, After i type the string in the searchview the listview is filtered but immediately it shows the complete listview as it is not maintain the filtered values.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
  searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            android.widget.Filter filter = descAdapter.getFilter();
            filter.filter(newText);
            return true;
        }

    });
    //searchView.setSubmitButtonEnabled(true);
    return true;

}

Myadapter:

public class DescAdapter extends BaseAdapter implements Filterable {

private seconds ds;
private ArrayList<mobstat> musers;
private ArrayList<mobstat> mOrig;
Activity seconds;

public DescAdapter(seconds ds, ArrayList<mobstat> musers, Activity seconds) {
    this.ds = ds;
    this.musers = musers;
    this.seconds = seconds;

}


@Override
public int getCount() {

    return musers.size();
}

@Override
public Object getItem(int i) {
    return musers.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    mobstat du = musers.get(i);
    String name = du.name;
    String status = du.status;


    Viewholder viewholder;
    if(view==null) {
        viewholder = new Viewholder();
        view = LayoutInflater.from(ds).inflate(R.layout.custom, null);
        viewholder.uname = (TextView) view.findViewById(R.id.name);
        viewholder.ustatus = (TextView) view.findViewById(R.id.status);
        view.setTag(viewholder);
    } else { viewholder = (Viewholder) view.getTag();  }
    viewholder.uname.setText(name);
    viewholder.ustatus.setText(status);


    return view;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            final FilterResults oReturn = new FilterResults();
            final ArrayList<mobstat> results = new ArrayList<mobstat>();

            if (mOrig == null)
                mOrig=musers;
            if(constraint!=null){
                if(mOrig!=null && mOrig.size()>0){
                    for(final mobstat g : mOrig){
                        if (g.getname().toLowerCase().contains(constraint.toString())){
                            results.add(g);}
                    }
                }
                oReturn.values=results;
            }
            return oReturn;
        }

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

            musers= (ArrayList<mobstat>) results.values;
            notifyDataSetChanged();
        }
    };
}
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}
}

Why filtered list is not maintaining even-though adapter values are updating every seconds.

1

There are 1 best solutions below

0
On

I see the need of updating values from server. You can write a new constructor for the adapter passing as parameter the query string(if it is not empty maybe). Filter the values in the constructor should work.

If you filter values after the constructor you will probably get a glitch in the UI as the adapter is first initialized with all values and then filtered