Android 如何在getItemCount不返回零的情况下清除筛选器列表?

Android 如何在getItemCount不返回零的情况下清除筛选器列表?,android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,我在RecyclerView适配器文件中有一个过滤器列表,用于过滤CardView项目列表。当我单击action_search MenuItem以启动列表上的SearchView时,filterList将被清除并返回搜索。我有一个EmptyRecyclView类,它运行一个checkIfEmpty(),当列表中没有卡片时(当getItemCount()==0时),该类返回一个默认的CardView。我的问题是每次在适配器中运行filter()方法时,filterList都会被清除,getItem

我在RecyclerView适配器文件中有一个过滤器列表,用于过滤CardView项目列表。当我单击action_search MenuItem以启动列表上的SearchView时,filterList将被清除并返回搜索。我有一个EmptyRecyclView类,它运行一个checkIfEmpty(),当列表中没有卡片时(当getItemCount()==0时),该类返回一个默认的CardView。我的问题是每次在适配器中运行filter()方法时,filterList都会被清除,getItemCount()==0,并且视图会翻转到默认的CardView。clear()仅临时使用,因为最终的filterList会立即从SearchView返回匹配的项目。当filterList.clear()使getItemCount==0时,如何避免视图翻转

Main Activity.java

...
@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.cardview_menu, menu);
    MenuItem item = menu.findItem(R.id.action_search);

    if (adapter == null || adapter.getItemCount() == 0) {
        item.setVisible(false);
    } else {
        item.setVisible(true);
        // Get the SearchView and set the searchable configuration
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
        searchView.setQueryHint(" Search here...");
    }
    return super.onCreateOptionsMenu(menu);
} 
适配器

public class MyRecylerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

   private List<ListItem> listItems, filterList;
   private Context mContext;
   public boolean mFilterSearch = false;  \\ *** added
   ...
   public MyRecylerAdapter(Context context, List<ListItem> listItems) {
    this.listItems = listItems;
    this.mContext = context;
    this.filterList = new ArrayList<>();
    this.filterList.addAll(this.listItems);
}

    public void clear() {
        while (getItemCount() > 0) {
        remove(getItem(0));
    }
}

    @Override
    public int getItemCount() {
        return (null!= filterList ? filterList.size() : 0);
    }

    public void filter(final String text) {

        new Thread(new Runnable() {
            @Override
            public void run() {

                mFilterSearch = true;  \\ *** added
                filterList.clear();  

                // If there is no search value, then add all original list items to filter list
                if (TextUtils.isEmpty(text)) {
                    filterList.addAll(listItems);
                }
                else {

                    // Iterate in the original List and add it to filter list...
                    for (ListItem item : listItems) {  
                    ...  
                    mFilterSearch = false; \\ *** added

不要清除
filterList
而是使用智能算法删除未搜索的项并从filterList中删除这些项,或者在
filter
方法的开头设置一个布尔值,并在搜索完成后将其设回,然后在
checkIfEmpty
check
if(needToCheck&&emptyView!=null&&getAdapter()!=null)
所以设置一个全局int变量,然后让filter方法触发它。然后让checkIfEmpty方法检查变量,如果它被触发,则不显示空视图?我使用了一个全局int变量,并将其设置为静态,然后使用if(Adapter.search!=1&&emptyView!=null…)这可以防止加载默认的CardView,但我丢失了现有RecyclerView项目的CardView…我有一个空白视图。如果我退出应用程序,然后重新启动它,则项目视图将按预期显示。我这里缺少什么?为什么使用
int
value?使用
boolean
不比它好吗?我认为您在完成工作后不会更改
int
boolean
值,您需要设置它并在
filter
方法中更改它。你这么做了吗?@shayan pourvatan好的,我按照你的建议修改了上面的代码,添加了一个布尔值。在EmptyRecylerView类中,我在“if(adapter…)行”上得到以下警告:条件总是false。如果我在filter方法中将它设置为true,它怎么可能总是false呢?我错过了什么?
public class EmptyRecyclerView extends RecyclerView {

private View emptyView;
private MyRecyclerAdapter adapter;
...
void checkIfEmpty() {
    if (adapter.mFilterSearch = false && emptyView != null && getAdapter() != null) { \\ *** added "adapter.mFilterSearch &&"
        final boolean emptyViewVisible =
                getAdapter().getItemCount() == 0;
        emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
        setVisibility(emptyViewVisible ? GONE : VISIBLE);
    }
}