当前位置: 首页 > 知识库问答 >
问题:

在使用filterable设置recyclerview后无法调用Adapter.GetFilter()

柯宜年
2023-03-14

我在我的RecolyerView中使用了Filterable。我想做的是,从EditText中筛选recyclerview。下面是我的实际代码。

public class NavDrawerAdapter_v2 extends RecyclerView.Adapter<NavDrawerAdapter_v2.ViewHolder> implements Filterable{

private static final int TYPE_ITEM = 0;

private ArrayList<String> menu_list;
private ArrayList<String> filtered_menu_list;
Context mContext;

public static class ViewHolder extends RecyclerView.ViewHolder {
    int Holderid;

    TextView shopName, shopLevel;

    public ViewHolder(View itemView,int ViewType) {
        super(itemView);

        shopName = (TextView) itemView.findViewById(R.id.rowText);
        shopLevel = (TextView) itemView.findViewById(R.id.rowLevel);

        if(ViewType == TYPE_ITEM) {
            Holderid = 0;
        }
    }
}

public NavDrawerAdapter_v2(Context mContext, ArrayList<String> menu_list){
    this.menu_list = menu_list;
    this.filtered_menu_list = menu_list;
    this.mContext = mContext;
}

@Override
public NavDrawerAdapter_v2.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == TYPE_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_item_row,parent,false); //Inflating the layout
        return new ViewHolder(v,viewType);
    }

    return null;
}

@Override
public void onBindViewHolder(NavDrawerAdapter_v2.ViewHolder holder, int position) {

    if (holder.Holderid == 0) {
        String getShopName = menu_list.get(position).split("-")[0];
        String getShopLevel = menu_list.get(position).split("-")[1];
        holder.shopName.setText(getShopName);
        holder.shopLevel.setText(getShopLevel);
    }
}

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

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

@Override
public int getItemViewType(int position) {

    return TYPE_ITEM;
}

public boolean okay(){
    return true;
}

@Override
public Filter getFilter() {
    return new UserFilter(this, menu_list);
}

private static class UserFilter extends Filter {

    private final NavDrawerAdapter_v2 adapter;

    private final ArrayList<String> originalList;

    private final ArrayList<String> filteredList;

    private UserFilter(NavDrawerAdapter_v2 adapter, ArrayList<String>originalList) {
        super();
        this.adapter = adapter;
        this.originalList = new ArrayList<>(originalList);
        this.filteredList = new ArrayList<>();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        filteredList.clear();
        final FilterResults results = new FilterResults();

        if (constraint.length() == 0) {
            filteredList.addAll(originalList);
        } else {
            final String filterPattern = constraint.toString().toLowerCase().trim();

            for (String getValue : originalList) {
                if (getValue.contains(filterPattern)) {
                    filteredList.add(getValue);
                }
            }
        }
        results.values = filteredList;
        results.count = filteredList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapter.filtered_menu_list.clear();
        adapter.filtered_menu_list.addAll((ArrayList<String>) results.values);
        adapter.notifyDataSetChanged();
    }
}

}

但是,在我的片段里。我无法调用Adapter.getFilter()。这里怎么了?

共有1个答案

陆翰学
2023-03-14

如果您希望EditText用于searchView目的,您需要为EditText添加更改监听器,如链接中所述:android on Text change listener

当文本更改时,您应该调用

adapter.getFilter().filter(newText);

或者,您应该尝试使用RecyclerView在操作栏中实现searchview。为此,请在RecyclerView适配器中实现getFilter()方法。您可以使用链接https://stackoverflow.com/A/10532898/1308990中实现的getFilter()方法。

<item android:id="@+id/menuSearch"
  android:title="search"
  android:icon = "@android:drawable/ic_menu_search"
  app:actionViewClass = "android.support.v7.widget.SearchView"
  app:showAsAction = "always|collapseActionView"></item>
MenuItem item = menu.findItem(R.id.menuSearch);
//SearchView searchView = (SearchView) item.getActionView(); 
SearchView searchView =  (SearchView) MenuItemCompat.getActionView(item); 

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

//Called when the query text is changed by the user.
@Override
public boolean onQueryTextChange(String newText) {
    Log.d("soda in MainActivity","onQueryTextChange method is called.");
    mutfagimFragment.adapter.getFilter().filter(newText);
    return false;
}
});
 类似资料:
  • 请注意:我已经检查了SO上的其他问题,虽然我可以消除错误,但它还有其他问题。 下面是我现有的代码: 我的适配器类: 修改代码查看各种答案: 现在,我没有得到错误,但是每次都被调用两次,并且recyclerview中的视图每次都在刷新。我做错了什么?请参阅logcat输出:

  • 在进行web客户端调用并使用前一个Mono的响应后,我无法在映射中获得填充值。以下是我所尝试的代码。parameters.size()的值为零。无法获得该值未被文件化的原因。我基本上希望从该方法返回年龄(而不是单对象)。使用block给出一个错误block()/blockfirst()/blocklast()是blocking,这在thread Reactor-http-nio-3中是不支持的。

  • 我使用递归方法在二叉树中使用键查找节点。找到节点后,我将其设置为引用变量foundNode并返回。问题是,当我读取对象时,它的值仍然是null。有人能帮忙吗?

  • 我试图用SSL (TLS)在节点间以及节点和客户端之间配置Kafka节点,但是遇到了配置问题。Kafka版本是2.3.0。我的相关设置是: 仅供参考,为了简单起见,我从实例化Kafka容器的docker-compose文件中复制了设置。env vars将1:1映射到server.properties.中的属性。在容器启动期间,这些设置将应用于server.properties文件。 当我开始使用此

  • 我试过很多次了,但什么也没有。 这是类的代码,它应该设置警报,但在指定的时间和日期没有发生任何事情。

  • 我使用的是my-faces 2.1.5 primefaces 3.2和WebLogic Server版本:10.3.2.0 当我生成文件并尝试通过p:filedownload下载它们时,我收到以下错误消息: 我不知道这是weblogic中的bug还是我的代码中的bug? 豆子: