There is a menu with SearchView
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" android:icon="?android:attr/actionModeWebSearchDrawable" android:title="Поиск" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" /> </menu>
How with it, implement the search in RecyclerView, replacing TextEdit in my code.
Here is the MainActivity code itself.
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, LoaderManager. LoaderCallbacks, BludaAdapter.OnItemClickListener {
private AutoCompleteTextView txtSearch; RecyclerView rvList; private ImageButton btnClear; DBHelper db; private int currentLoader; final private static int LOADER_BLUDA_RU = 0; final private static int LOADER_BLUDA_ZARUB = 1; BludaAdapter bludaAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); db = new DBHelper(this); txtSearch = (AutoCompleteTextView) findViewById(R.id.txtSearch); rvList = (RecyclerView) findViewById(R.id.rvList); LinearLayoutManager layoutManager = new LinearLayoutManager(this); rvList.setLayoutManager(layoutManager); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, layoutManager.getOrientation()); rvList.addItemDecoration(dividerItemDecoration); btnClear = (ImageButton) findViewById(R.id.btnClear); bludaAdapter = new BludaAdapter(this); rvList.setAdapter(bludaAdapter); bludaAdapter.setOnItemClickListener(this); Bundle bundle = new Bundle(1); bundle.putString("filter", ""); getSupportLoaderManager().initLoader(LOADER_BLUDA_RU, bundle, this); getSupportLoaderManager().initLoader(LOADER_BLUDA_ZARUB, bundle, this); txtSearch.addTextChangedListener(new TextWatcher(){ public void onTextChanged(CharSequence s, int start, int before, int count) { refreshCursor(s.toString()); } @Override public void afterTextChanged(Editable text) {} @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} }); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { String filter = bundle.getString("filter"); return new MyCursorLoader(this, db, id, filter); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { bludaAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { bludaAdapter.swapCursor(null); } static class MyCursorLoader extends CursorLoader { Cursor cursor; DBHelper dbHeler; final int loaderID; String filter; public MyCursorLoader(Context context, DBHelper dbHeler, int id, String filter) { super(context); this.dbHeler = dbHeler; loaderID = id; this.filter = filter; } @Override protected Cursor onLoadInBackground() { switch (loaderID) { case LOADER_BLUDA_RU: cursor = dbHeler.getRusBluda(filter); break; case LOADER_BLUDA_ZARUB: cursor = dbHeler.getZarubBluda(filter); break; } return cursor; } } private void refreshCursor(String str) { Bundle bundle = new Bundle(1); bundle.putString("filter", str); getSupportLoaderManager().restartLoader(currentLoader, bundle, this); } @Override protected void onResume() { super.onResume(); txtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { if (b && txtSearch.getText().toString().length() > 0) btnClear.setVisibility(View.VISIBLE); else btnClear.setVisibility(View.INVISIBLE); } }); txtSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if(charSequence.length() != 0){ btnClear.setVisibility(View.VISIBLE); }else{ btnClear.setVisibility(View.INVISIBLE); } } @Override public void afterTextChanged(Editable editable) { } }); Bundle bundle = new Bundle(1); bundle.putString("filter", ""); getSupportLoaderManager().restartLoader(currentLoader, bundle, this); } public void onClearBtnClick(View view) { txtSearch.setText(""); btnClear.setVisibility(View.INVISIBLE); }
}
Class Adapter
public class BludaAdapter extends RecyclerViewCursorAdapter<BludaAdapter.BludaViewHolder> { OnItemClickListener mItemClickListener; public interface OnItemClickListener { void onItemClick(long id); void onFavoriteButtonClick(long id, boolean isFavorite); } public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; } /** * Index of the name column. */ /** * Constructor. * @param context The Context the Adapter is displayed in. */ public BludaAdapter(Context context) { super(context); setupCursorAdapter(null, 0, R.layout.item, false); } /** * Returns the ViewHolder to use for this adapter. */ @Override public BludaViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new BludaViewHolder(mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent)); } /** * Moves the Cursor of the CursorAdapter to the appropriate position and binds the view for * that item. */ @Override public void onBindViewHolder(BludaViewHolder holder, int position) { // Move cursor to this position mCursorAdapter.getCursor().moveToPosition(position); // Set the ViewHolder setViewHolder(holder); // Bind this view mCursorAdapter.bindView(null, mContext, mCursorAdapter.getCursor()); } /** * ViewHolder used to display a movie name. */ public class BludaViewHolder extends RecyclerViewCursorViewHolder implements View.OnClickListener { public final TextView txtBludo; public final TextView txtRecept; public final Button btnLike; int like; int id; public BludaViewHolder(View view) { super(view); txtBludo = (TextView) view.findViewById(R.id.txtBludo); txtRecept = (TextView) view.findViewById(R.id.txtRecept); btnLike = (Button) view.findViewById(R.id.btnLike); view.setOnClickListener(this); btnLike.setOnClickListener(this); } @Override public void bindCursor(Cursor cursor) { // переменные id, like переносим в поле класса-холдера, чтобы был доступ из всех методов id = cursor.getInt(cursor.getColumnIndex(Contract.Bluda._ID)); like = cursor.getInt(cursor.getColumnIndex(Contract.Bluda.COL_LIKE)); String bludo = cursor.getString(cursor.getColumnIndex(Contract.Bluda.COL_BLUDO)); String recept = cursor.getString(cursor.getColumnIndex(Contract.Bluda.COL_RECEPT)); txtBludo.setText(bludo); txtRecept.setText(recept); // конструкцию с if-else упрощаем btnLike.setText((like == 1)? "В избранном":"Нет в избранном"); } @Override public void onClick(View v) { //int position = getAdapterPosition(); switch (v.getId()) { case R.id.btnLike: mItemClickListener.onFavoriteButtonClick(id, like == 1); break; default: mItemClickListener.onItemClick(id); } } } }