0

In this app, the user will input the item detail and save it in the SQLite database. and display the saved item in a recyclerView. Now I need more two feature to add. First is to search from the list item. second is to make the item clickable so that if an item is clicked it'll take to a detail view activity. here is my ItemListActivity java class file

package com.example.autoparts;

public class ItemListActivity extends AppCompatActivity {

    Context context = ItemListActivity.this;

    private RecyclerView itemsRecycler;

    private ArrayList<Items> listItems;

    private SearchView iSearchView;

    private SearchManager manager;

    //To customize the layout property
    private RecyclerView.LayoutManager itemLayoutManager;
    //calling the ItemAdapter
    private ItemAdapter itemAdapter;
    //calling the dbhelper class
    PartsDbHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_list);

        //Recycler View for items to display
        itemsRecycler = (RecyclerView) findViewById(R.id.items_recycler_view);
        dbHelper = new PartsDbHelper(this);

        manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        //set the fixed size of the RecyclerView
        itemsRecycler.setHasFixedSize(true);
        //setting Linear as layout
        itemsRecycler.setLayoutManager(new LinearLayoutManager(this));
        itemAdapter = new ItemAdapter(listItems, this);

        generateObjects();
        getItemsFromSQLite();

    }


    private void generateObjects() {
        listItems = new ArrayList<>();
        itemAdapter = new ItemAdapter(listItems, this);


        RecyclerView.LayoutManager layoutManager = new 
        LinearLayoutManager(getApplicationContext());
        itemsRecycler.setLayoutManager(layoutManager);

        itemsRecycler.setAdapter(itemAdapter);

        dbHelper = new PartsDbHelper(this);
    }

    private void getItemsFromSQLite() {
        //AsyncTask is used that sqlite operation not blocks the UI Thread
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... voids) {
                listItems.clear();
                listItems.addAll(dbHelper.getAllItems());

                return null;
            }

            protected void onPostExecute(Void params) {
                super.onPostExecute(params);
                itemAdapter.notifyDataSetChanged();
            }
        }.execute();
    }

    //Building Menu
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        final MenuItem item = menu.findItem(R.id.searchMenu);
        SearchView searchView = (SearchView) item.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                if (!TextUtils.isEmpty(s)) {

                }

                return true;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                ArrayList<String> itemList = new ArrayList<>();

                for (String items : itemList) {
                    if (items.toLowerCase().contains(s.toLowerCase())) ;
                    itemList.add(items);
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String>
                    (ItemListActivity.this, 
                    android.R.layout.simple_list_item_1, itemList);

                return true;
            }
        });
        return true;
    }
}

this is my item adapter class

package com.example.autoparts;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

public class ItemAdapter extends RecyclerView.Adapter<ItemHolder> {

Context iContext;

List<Items> itemsList;

public ItemAdapter(List<Items> itemsList, Context context) {
    this.itemsList = itemsList;
    iContext = context;
}

//Initiating viewHolder
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    View v = 
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view, null);

    //Holder
    ItemHolder iHolder = new ItemHolder(v);

    return iHolder;
}

@Override
public void onBindViewHolder(ItemHolder itemHolder, int i) {
    Items item = itemsList.get(i);

    itemHolder.itemNameTextView.setText(item.getItem());
    itemHolder.itemVendorTextView.setText(item.getVendor());
    itemHolder.itemQtyTextView.setText(Integer.toString(item.getQty()));
    itemHolder.itemPriceTextView.setText(Integer.toString(item.getPrice()));
}

@Override
public int getItemCount() {
    if (itemsList != null)
        return itemsList.size();
    else
        return 0;
    }

}

this is a view holder class

package com.example.autoparts;
public class ItemHolder extends RecyclerView.ViewHolder {

    // public final View view;
    public TextView itemNameTextView;
    public TextView itemVendorTextView;
    public TextView itemQtyTextView;
    public TextView itemPriceTextView;

    public ItemHolder(View itemView) {
        super(itemView);
        itemNameTextView = (TextView)itemView.findViewById(R.id.item_name_text_view);
        itemVendorTextView = (TextView)itemView.findViewById(R.id.item_vendor_text_view);
        itemQtyTextView = (TextView) itemView.findViewById(R.id.item_qty_text_view);
        itemPriceTextView = (TextView) itemView.findViewById(R.id.item_price_text_view);
    }
}

this is menu xml file

<?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/searchMenu"
        android:icon="@drawable/ic_action_search"
        android:title="@string/search_title"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="collapseActionView|ifRoom" />
</menu>
Geno Chen
  • 4,916
  • 6
  • 21
  • 39
abdulAhad
  • 3
  • 6

2 Answers2

0

first add private ArrayList<Items> arraylist; above class ItemAdapter for intialize;

and also add this code in class ItemAdapter :

   public void filterAll( String Qty ) {

            itemsList.clear();

         if (Qty.length() < 0) {
                    itemsList.addAll(arraylist);
                } else {
          for (Items ls : arraylist) {

 if (ls.getqty().contains(qty) ) {

                itemsList.add(ls);

            }

                }
 notifyDataSetChanged();
}

now in class ItemListActivity in part onQueryTextChange :

itemAdapter.filterall(s.tostring());  
Mersad Nilchy
  • 611
  • 6
  • 18
0

Inside your adapter:

public class ItemAdapter extends RecyclerView.Adapter<ItemHolder> implements Filterable {


    private Context iContext;

    private List<Items> itemsList = new ArrayList<>();
    private List<Items> itemsListFilter = new ArrayList<>();

    public ItemAdapter(List<Items> itemsList, Context context) {
        this.itemsList = itemsList;
        this.itemsListFilter = itemsList;
        iContext = context;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                itemsList = (List<Items>) results.values;
                notifyDataSetChanged();
            }
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<Items> filteredList = new ArrayList<>();
                String searchText = constraint.toString().toLowerCase();
                String[] split = searchText.split(",");
                ArrayList<String> searchGenres = new ArrayList<>(split.length);
                for (String aSplit : split) {
                    // remove spaces
                    String trim = aSplit.trim();
                    // skip empty entries
                    if (trim.length() > 0)
                        searchGenres.add(trim);
                }

                for (Items dataNames : itemsListFilter) {
                    // filter by title
                    if (dataNames.getItem().toLowerCase().trim().contains(searchText)) {
                        filteredList.add(dataNames);
                    }
                }
                results.count = filteredList.size();
                results.values = filteredList;
                return results;
            }

        };
        return filter;
    }



}

In ItemListActivity :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.YOUR_MENU, menu);

    MenuItem item = menu.findItem(R.id.searchMenu);
    SearchView searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            itemAdapter.getFilter().filter(newText);
            return true;
        }
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

Menu

<?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/searchMenu"
        android:icon="@drawable/ic_action_search"
        android:title="@string/search_title"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="collapseActionView|ifRoom" />
</menu>
S.R
  • 2,819
  • 2
  • 22
  • 49
  • should i use the top answered suggestion or only yours? – abdulAhad Mar 17 '19 at 11:19
  • @abdulAhad if the top answer solved your problem accept it by clicking on left side check mark and use it. he answered first. else use mine. – S.R Mar 17 '19 at 11:44
  • i used yours but i got a error and in the logcat it says "android.widget.SearchView cannot be cast to android.support.v7.widget.SearchView". – abdulAhad Mar 17 '19 at 12:11
  • @abdulAhad it is already telling you. you are using wrong class for search item, look into update. – S.R Mar 17 '19 at 12:15
  • thanks mate.. it worked.. can you help me with how can enable the onCLickListener so that if i click on an item it'll take me to another activity where i can see the more detail of the item? thanks again – abdulAhad Mar 17 '19 at 12:16
  • @abdulAhad you should open separate question, but before you do that check this SO question https://stackoverflow.com/questions/24471109/recyclerview-onclick – S.R Mar 17 '19 at 12:24
  • its pretty much convincing. do you think it'll work? – abdulAhad Mar 17 '19 at 12:40