【问题标题】:How to search through a recyclerView which is being populated from SQLite database?如何搜索从 SQLite 数据库填充的 recyclerView?
【发布时间】:2019-03-17 09:12:03
【问题描述】:

在这个应用程序中,用户将输入项目详细信息并将其保存在 SQLite 数据库中。并在 recyclerView 中显示保存的项目。现在我需要添加更多两个功能。 首先是从列表项中搜索。 第二个是使项目可点击,以便如果单击项目,它将进入详细视图活动。 这是我的 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;
    }
}

这是我的项目适配器类

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;
    }

}

这是一个视图持有者类

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);
    }
}

这是菜单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>

【问题讨论】:

    标签: java android sqlite android-layout android-recyclerview


    【解决方案1】:

    在您的适配器内部:

    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;
        }
    
    
    
    }
    

    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);
    }
    

    菜单

    <?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>
    

    【讨论】:

    • 我应该使用回答最多的建议还是只使用你的建议?
    • @abdulAhad 如果最佳答案解决了您的问题,请单击左侧复选标记并使用它。他先回答。否则使用我的。
    • 我用过你的,但我遇到了一个错误,在 logcat 中显示“android.widget.SearchView 无法转换为 android.support.v7.widget.SearchView”。
    • @abdulAhad 它已经告诉你了。您为搜索项使用了错误的类,请查看更新。
    • 谢谢队友..它工作..你能帮我解决如何启用 onCLickListener 以便如果我点击一个项目,它会带我到另一个活动,在那里我可以看到更多细节项目?再次感谢
    【解决方案2】:

    首先在ItemAdapter类上方添加private ArrayList&lt;Items&gt; arraylist;进行初始化;

    并将此代码添加到 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();
    }
    

    现在在类 ItemListActivity 部分 onQueryTextChange :

    itemAdapter.filterall(s.tostring());  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多