как отфильтровать представление поиска в окне перезапуска на основе двух разных массивов объектов - PullRequest
0 голосов
/ 07 октября 2019

В настоящее время мне нужно выполнить поиск в Android Studio. Я использовал реселлервью, чтобы отобразить всю мою информацию. Мой поиск теперь может фильтровать по имени, но не по состоянию.

(Я думаю, что проблема в том, что Arraylist в цикле содержит только информацию об имени и ссылке, но не другие четыре данных (третий конструктор). Может кто-нибудь сказать мне, как фильтровать два типа информации (пользователь может ввести либоимя или состояние в одном и том же пространстве) в одном поисковике? Большое спасибо:).

Вот мой класс объектов, который состоит из 3 типов конструкторов.

public A(){

    }

    public A(String name,String link){
        this.name = name;

        this.link = link;
    }

    public A(String cname,String ad,String ad2, String state){

        this.cname=cname;
        this.ad=ad;
        this.ad2=ad2;
        this.state=state;

    }

Вот мой класс Java

ArrayList<A> t;
ArrayList<A> c;
ArrayList<String> searchnamestate;

  databaseReference = FirebaseDatabase.getInstance().getReference();
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot dataSnapshot1 : dataSnapshot.child("alluser").child("thera").getChildren()) {
                    A a= dataSnapshot1.getValue(A.class);
                    tkey.add(dataSnapshot1.getKey());
//add the name into an String arraylist named searchnamestate             searchnamestate.add(dataSnapshot1.getValue(A.class).getName().toLowerCase());
                    t.add(a);
                }
                for (DataSnapshot dataSnapshot1 : dataSnapshot.child("company").getChildren()) {
                    A comp = dataSnapshot1.getValue(A.class);
//add the state into an String arraylist named searchnamestate                    searchnamestate.add(dataSnapshot1.getValue(A.class).getState().toLowerCase());
                   c.add(comp);
                }

                adapter = new MyRecyclerViewAdapter(MainActivity.this, t,c, tkey);
                rv.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getApplicationContext(), "Oh no!", Toast.LENGTH_SHORT).show();
            }
        });

//searchview filter the information display in recyclerview based on what type
//in the searchview
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //    adapter.getFilter().filter(newText);

                String newquery= newText.toLowerCase();
                for(int i=0; i<searchnamestate.size();i++) {
                    if (searchnamestate.get(i).contains(newquery)) {
                        adapter.filter(newquery);
                    }
                    else{
                      // Toast.makeText(MainActivity.this, "No Match found", Toast.LENGTH_LONG).show();
                    }
                }

                return false;
            }
        });


    }

Вот мой класс адаптера

 ArrayList<Therapist> tlist;
    ArrayList<Therapist> newtlist;
    ArrayList<Therapist> complist;

//the t is using the second constructor while comp is the third constuctor in //Object class
 public MyRecyclerViewAdapter(Context c, ArrayList<A> t, ArrayList<A> comp, ArrayList<String> tk ){
        context=c;
        tlist=t;
        complist=comp;
//add all the element from tlist into newtlist
        this.newtlist = new ArrayList<A>();
        this.newtlist.addAll(t);
tkey=tk;

    }

 public void filter(String findtext) {
        //  findtext = findtext.toLowerCase(Locale.getDefault());
        tlist.clear();
        if (findtext.length() == 0) {
            tlist.addAll(newtlist);
        } else {
            for (A wp : newtlist) {
//if the name type in searchview match name that stored in newtlist, it can filter based in name
                if (wp.getName().toLowerCase(Locale.getDefault()).contains(findtext)) {
                    tlist.add(wp);
                }

            }
        }
        notifyDataSetChanged();
    }

 @Override
    public int getItemCount() {
        return tlist.size();
    }

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Создайте метод получения для state в классе A

, затем добавьте еще одно условие wp.getState().toLowerCase().contains(findtext)

 public void filter(String findtext) {
        //  findtext = findtext.toLowerCase(Locale.getDefault());
        tlist.clear();
        if (findtext.length() == 0) {
            tlist.addAll(newtlist);
        } else {
            for (A wp : newtlist) {
//if the name type in searchview match name that stored in newtlist, it can filter based in name
                if (wp.getName().toLowerCase().contains(findtext) 
                    || wp.getState().toLowerCase().contains(findtext)) {

                    tlist.add(wp);
                }

            }
        }
       notifyDataSetChanged();
    }
0 голосов
/ 07 октября 2019

Я думаю, вы хотите, чтобы список поиска по штату. просто добавьте еще условие в ваше заявление if if (wp.getName().toLowerCase(Locale.getDefault()).contains(findtext) || wp.getName().toLowerCase(Locale.getDefault()).contains(findtext)){ tlist.add(wp); }

...