简体   繁体   English

如何搜索从SQLite数据库填充的recyclerView?

[英]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.

相关问题 如何在从 SQLite 数据库填充的列表视图 android 中进行搜索 - how to make a search in a list view android which is populated from SQLite database 在android中通过Recyclerview从sqlite数据库中删除记录 - Delete record from sqlite database through Recyclerview in android 如何阻止从 Firebase 数据库填充并由 FirebaseRecyclerAdapter 管理的 RecyclerView 重新创建已删除的视图? - How can I stop my RecyclerView, populated from Firebase Database and managed by FirebaseRecyclerAdapter, from recreating deleted views? 如何从sqlite数据库附加RecyclerView适配器 - How do I attach RecyclerView adapter from sqlite database 如何同时从recyclerView和sqlite数据库中删除行? - How to delete rows from recyclerView and sqlite database both? 在Android Search上搜索SQLite数据库 - Search through SQLite database on Android Search 如何使用我自己的sqlite数据库并在android中搜索它? - How to use my own sqlite database and search through it in android? JTable未填充从数据库中提取的数据 - JTable is not being populated with the data being pulled from a database 从SQLite数据库获取数据并显示在recyclerview中 - getting data from a SQLite database and display in recyclerview TextViews 没有在 RecyclerView 中填充来自 SQLite 数据库的数据 - TextViews not populating with data from SQLite database in RecyclerView
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM