Android 如何在getItemCount不返回零的情况下清除筛选器列表?
我在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.javaAndroid 如何在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
...
@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
checkif(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);
}
}