Firebase recycleradapter с фильтром, используя searchview - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть список проектов в базе данных firebase, и он отображается в Recyclerview с использованием firebaserecycleradapter. Работает нормально. У меня также есть searchview для фильтрации списка на основе поискового запроса. Но адаптер не показывает отфильтрованный список. При вводе запроса в поисковом представлении окно повторного использования становится пустым. Может ли кто-нибудь выделить ошибку в моем кодировании и исправить меня, чтобы получить желаемый результат. Я дал ниже кодировки.

public class HomeActivity extends AppCompatActivity {

    private DatabaseReference mDatabase;
    private RecyclerView PList;
    private FirebaseRecyclerAdapter<project, ProjViewHolder> FBRA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        PList = findViewById(R.id.ProjList);
        PList.setHasFixedSize(true);
        PList.setLayoutManager(new LinearLayoutManager(this));
        mDatabase = FirebaseDatabase.getInstance().getReference().child("Projects");
    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerOptions<project> options = new FirebaseRecyclerOptions.Builder<project>()
                .setQuery(mDatabase, project.class).build();
        FBRA = new FirebaseRecyclerAdapter<project, ProjViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull ProjViewHolder holder, int position, @NonNull project model) {
                pbar.setVisibility(View.GONE);
                String proj_key = getRef(position).getKey();
                holder.prname.setText(model.getPname());
                holder.prlocation.setText(model.getPlocation());
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent detactivity = new Intent(HomeActivity.this, InfoActivity.class);
                        detactivity.putExtra("ProjID", proj_key);
                        startActivity(detactivity);
                    }
                });
            }

            @NonNull
            @Override
            public ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.proj_row, parent, false);
                ProjViewHolder vh = new ProjViewHolder(view);
                return vh;
            }
        };
        PList.setAdapter(FBRA);
        FBRA.startListening();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        final MenuItem search = menu.findItem(R.id.search);
        final SearchView searchView = (SearchView) search.getActionView();
        searchView.setQueryHint("Search Project");
        if (searchView != null) {
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    fbsearch(query);
                    return false;
                }
                @Override
                public boolean onQueryTextChange(String newText) {
                    fbsearch(newText);
                    return false;
                }
            });
        }
        return true;
    }

    private void fbsearch (String searchText){
        String pquery = searchText.toLowerCase();
        Query sQuery = mDatabase.orderByChild("pname").equalTo(pquery);
        FirebaseRecyclerOptions<project> soptions = new FirebaseRecyclerOptions.Builder<project>()
                .setQuery(sQuery, project.class).build();
        FBRA = new FirebaseRecyclerAdapter<project, ProjViewHolder>(soptions) {
            @Override
            protected void onBindViewHolder(@NonNull ProjViewHolder holder, int position, @NonNull project model) {
                pbar.setVisibility(View.GONE);
                String proj_key = getRef(position).getKey();
                holder.prname.setText(model.getPname());
                holder.prlocation.setText(model.getPlocation());
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent detactivity = new Intent(HomeActivity.this, InfoActivity.class);
                        detactivity.putExtra("ProjID", proj_key);
                        startActivity(detactivity);
                    }
                });
            }

            @NonNull
            @Override
            public ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.proj_row, parent, false);
                ProjViewHolder vh = new ProjViewHolder(view);
                return vh;
            }
        };

        PList.setAdapter(FBRA);
        FBRA.startListening();
    }

    public class ProjViewHolder extends RecyclerView.ViewHolder {
        TextView prname, prlocation, prservice, prvalue, practual;
        public ProjViewHolder(@NonNull View itemView) {
            super(itemView);
            prname = itemView.findViewById(R.id.FPName);
            prlocation = itemView.findViewById(R.id.FPLocation);
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        FBRA.stopListening();
    }
}

1 Ответ

0 голосов
/ 17 февраля 2020

Да, я смог определить проблему в коде. Поскольку запрос чувствителен к регистру, список поиска не отображался. Я создал новое поле для хранения имени проекта в нижнем регистре. Затем я сделал запрос к новому полю. Исправленный код приведен ниже.

  private void fbsearch (String searchText){
    String pquery = searchText.toLowerCase();
    Query sQuery = mDatabase.orderByChild("pnamelowcase").startAt(pquery).endAt(pquery + "\uf8ff");
    FirebaseRecyclerOptions<project> options = new FirebaseRecyclerOptions.Builder<project>()
            .setQuery(sQuery, project.class).setLifecycleOwner(this).build();
    FBRA = new FirebaseRecyclerAdapter<project, ProjViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull ProjViewHolder holder, int position, @NonNull project model) {
            String proj_key = getRef(position).getKey();

            holder.prname.setText(model.getPname());
            holder.prlocation.setText(model.getPlocation());
            holder.prservice.setText(model.getPservice());
            holder.prvalue.setText(model.getPvalue());
            holder.practual.setText(model.getPactual());

            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent detactivity = new Intent(HomeActivity.this, InfoActivity.class);
                    detactivity.putExtra("ProjID", proj_key);
                    startActivity(detactivity);
                }
            });
        }

        @NonNull
        @Override
        public ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.proj_row, parent, false);
   //         ProjViewHolder vh = new ProjViewHolder(view);
            return new ProjViewHolder(view);

        }
    };
    PList.setAdapter(FBRA);
}

То, что я заметил, что Запрос работает только с startAt и endAt Если я изменю на любой другие запросы, такие как equalTo , не работают.

Я также заметил еще одну проблему, заключающуюся в том, что обычный список не отображается после закрытия окна поиска. Если кто-то обнаружит проблему в моем коде, выделите ее и скажите, почему другие запросы не работают и как вернуть исходный список после закрытия окна поиска.

...