[英]How to search through a recyclerView which is being populated from SQLite database?
In this app, the user will input the item detail and save it in the SQLite database. 在此应用程序中,用户将输入项目详细信息并将其保存在SQLite数据库中。 and display the saved item in a recyclerView. 并在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 这是我的ItemListActivity java类文件
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文件
<?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>
first add private ArrayList<Items> arraylist;
首先添加private ArrayList<Items> arraylist;
above class ItemAdapter for intialize; 上面的ItemAdapter类进行初始化;
and also add this code in class ItemAdapter : 并将此代码添加到类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 : 现在在类ItemListActivity中部分onQueryTextChange:
itemAdapter.filterall(s.tostring());
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
: 在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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.