ZDK
ZDK

Reputation: 91

Android Searchview not in actionbar create on other view

I want to put a custom search view box on other view but not on actionbar.

Same as the Search in Google Maps Application has dialog Search on top left.

when input 1 character to update arraylist result.

i dont known to custom and create method onQueryTextSubmit,onQueryTextChange of SearchView.

How to Code it.

Thank you.

Upvotes: 2

Views: 1846

Answers (2)

msevgi
msevgi

Reputation: 4904

activity class

public class MyActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_my);
      EditText edittext_search = (EditText) findViewById(R.id.edittext_search);
      edittext_search.addTextChangedListener(new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

         }

         @Override
         public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            mAdapter.getFilter().filter(charSequence);
         }

         @Override
         public void afterTextChanged(Editable editable) {

         }
      });
   }
}

layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <EditText
        android:id="@+id/edittext_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

adapter class

public class MyAdapter extends ArrayAdapter<String> implements Filterable {
    private MyFilter mFilter;
    private static List<String> mOriginItmeList;
    private static List<String> mItemList;
   public MyAdapter(Context context, int resource, List<String> objects) {
      super(context, resource, objects);
   }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //TODO inflate listview row
        return super.getView(position, convertView, parent);
    }
    @Override
    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new MyFilter();
        }
        return mFilter;
    }
    private class MyFilter extends Filter {


        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            String search = constraint.toString();
            if (TextUtils.isEmpty(search)) {
                results.values = mOriginItmeList;
                results.count = mOriginItmeList.size();
            } else {
                ArrayList<String> tempList = new ArrayList<String>();
                for (String item : mOriginItmeList) {
                    if (item==search) {
                        tempList.add(item);
                    }
                }
                results.values = tempList;
                results.count = tempList.size();
            }
            return results;
        }


        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mItemList = (ArrayList<String>) results.values;
        }
    }

}

Upvotes: 1

The concept is the same as if you did in the ActionBar. You need associate the events to the EditText, something like this:

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                if (myAdapter != null) {
                    myAdapter.getFilter().filter(charSequence);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

And in the adapter you implement the logic to filter the data. For this, you can implement Filterable class. Try something like this:

@Override
public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                List<Object> filteredResult = getFilteredResults(charSequence);

                FilterResults results = new FilterResults();
                results.values = filteredResult;
                results.count = filteredResult.size();

                return results;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                listaFiltrada = (ArrayList<Documento>) filterResults.values;
                MyAdapter.this.notifyDataSetChanged();
            }


            private ArrayList<Object> getFilteredResults(CharSequence constraint){
                if (constraint.length() == 0){
                    return  listaDocumentos;
                }
                ArrayList<Object> listResult = new ArrayList<Object>();
                for (Object obj : listaTotal){
                    if (condition){
                        listResult.add(obj);
                    }
                }
                return listResult;
            }
        };
    }

Hope it helps you!! :)

Upvotes: 1

Related Questions