【问题标题】:SearchView problem with recyclerView populated from Firebase从 Firebase 填充的 recyclerView 的 SearchView 问题
【发布时间】:2019-06-04 00:53:45
【问题描述】:

我有一个从我的 Firebase 数据库中填充的 RecyclerView。该列表很长,因此我希望用户能够搜索该列表。但是当用户在 SearchView 中输入第一个字符时,什么都没有返回。

这是我的 FavouriteFragment 中的 onCreateView 已更新

  @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
    View view = inflater.inflate(R.layout.fragment_favourites, container, false);

    mAuth = FirebaseAuth.getInstance();
    current_user_id = mAuth.getCurrentUser().getUid();

    recyclerView = (RecyclerView) view.findViewById(R.id.route_favourites);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    search = (SearchView) view.findViewById(R.id.search);

    search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("BusRoute");
            rootRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot datasnapshot : dataSnapshot.getChildren()){
                        String key = datasnapshot.getKey();

                        Query query = rootRef.child(key).orderByChild("route").equalTo(newText);
                        query.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                                favouritesAdapter.notifyDataSetChanged();

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

            return true;
        }
    });

    favouritesAdapter = new FavouritesAdapter(getDataSetHistory(), getActivity());
    favouritesAdapter.notifyDataSetChanged();
    recyclerView.setAdapter(favouritesAdapter);

    getBusRoutes();
    return view;
}

这是我最喜欢的适配器:

public class FavouritesAdapter extends RecyclerView.Adapter<FavouritesAdapter.ViewHolder> implements Filterable {
    private List<BusRoute> favourites;
    private List<BusRoute> searchList;
    private Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder{
        TextView routeTextView, originTextView, destinationTextView;
        ImageView addFavouritesButton;

        ViewHolder(View v){
            super(v);
            this.routeTextView = v.findViewById(R.id.route);
            this.destinationTextView = v.findViewById(R.id.destination);
            this.originTextView = v.findViewById(R.id.origin);
            this.addFavouritesButton = v.findViewById(R.id.addToFavourites);
            addFavouritesButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String route = routeTextView.getText().toString();
                    System.out.println("clicked");
                    System.out.println(route);
                    //addToFavourites(route);
                }
            });
        }

    @NonNull
    @Override
    public FavouritesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
       View view = LayoutInflater.from(context).inflate(R.layout.favourite_card, parent, false);

       return new FavouritesAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull FavouritesAdapter.ViewHolder viewHolder, int i) {
        BusRoute bus = favourites.get(i);
        viewHolder.originTextView.setText(String.valueOf(bus.getOrigin()));
        viewHolder.destinationTextView.setText(String.valueOf(bus.getDestination()));
        viewHolder.routeTextView.setText(String.valueOf(bus.getRoute()));
    }

    public FavouritesAdapter(ArrayList<BusRoute> favourites, Context context){
        this.context = context;
        this.favourites = favourites;
        searchList = new ArrayList<>(favourites);
    }

    @Override
    public int getItemCount() {
        System.out.println(favourites);
        return favourites.size();
    }

    @Override
    public Filter getFilter() {
        return favouriteFilter;
    }

    private Filter favouriteFilter = new Filter(){

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            System.out.println("filter results");
           List<BusRoute> filteredList = new ArrayList<>();
           if(constraint==null || constraint.length()==0){
               filteredList.addAll(searchList);
           }else{
               String filterPattern = constraint.toString().toLowerCase().trim();

               for(BusRoute br : searchList){
                   if(br.getRoute().toLowerCase().contains(filterPattern)){
                       filteredList.add(br);
                   }else{
                       System.out.println("nothing here");
                   }
               }
           }
            System.out.println("set filter results");
           FilterResults results = new FilterResults();
           results.values = filteredList;
           return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            favourites.clear();
            favourites.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };
}

我只想有一个可过滤的搜索栏,但无法正常工作!如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 签出this
  • 感谢您的回复!这适用于 SearchView 吗?如果是这样,它应该在 onQueryTextChange 中完成吗?
  • 是的,它确实有效。是的,在onQueryTextChange 内。有用吗?
  • 从调试中我可以看到我正在从数据库访问正确的信息,但我似乎无法更新适配器以显示我想要的结果。我更新了我的代码,你介意看一下吗?

标签: android firebase android-recyclerview


【解决方案1】:

在发布结果方法中。不要清除您的阵列列表。这就是空数据的原因

【讨论】:

  • 但下一行是添加过滤后的值。当我删除它并输入一个字符时,完整列表仍然存在,但没有应用过滤器,所以它仍然不起作用
【解决方案2】:
Try this   
@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String query = charSequence.toString();

            List<String> filtered = new ArrayList<>();

            if (query.isEmpty()) {
                filtered = items;
            } else {
                for (String movie : items) {
                    if (movie.toLowerCase().contains(query.toLowerCase())) {
                        filtered.add(movie);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.count = filtered.size();
            results.values = filtered;
            return results;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多