2017-10-06 11 views
0

リストビューにデータを表示できるFirebaseデータベースがあります。すべてのデータはオブジェクトに格納され、オブジェクトにデータが格納されます。私は "Lars"の例を検索バーに書くことができるようにしたいのですが、リストビューを更新してその文字列を含むオブジェクトのみを含むようにしなければなりません。最初のforループは動作し、2番目のforループはデータを検索しようとしています。 enter image description hereAndroidでリストビューを使用してFirebaseからデータを検索する

private DatabaseReference mDatabaseReference; 
    private ListView mUserList; 
    private SearchView searchModule; 

    private ArrayList<String> mUsernames = new ArrayList<>(); 
    private ArrayList<String> filteredUsernames = new ArrayList<>(); 

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

     mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers"); 

     mUserList = (ListView) findViewById(R.id.UserListView); 


     searchModule = (SearchView) findViewById(R.id.SearchTab); 

     final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUsernames); 

     final ArrayAdapter<String> filteredArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, filteredUsernames); 

     mUserList.setAdapter(arrayAdapter); 

     mDatabaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 

        Map<String, String> map = (Map<String, String>) childSnapshot.getValue(); 
        Log.v("YourValue,","Map value is:" +map.toString()); 
        Log.d("TAG", "onChildAdded:" + dataSnapshot.getKey()); 
        Buyers buyerList = new Buyers(map); 
        mUsernames.add(buyerList.getData()); 
       } 
       CharSequence searchValue = (CharSequence) searchModule; 
       arrayAdapter.getFilter().filter(searchValue); 

       arrayAdapter.notifyDataSetChanged(); 
      } 


      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 

答えて

1

3つのこと:

  1. あなたはfilteredUsernamesにデータを追加しない 私Firebase構造は、このようになります。 mUsernamesと同様に、filteredUsernamesにデータを追加する必要があります。
  2. れるgetFilterはArrayAdapterの方法であり、あなたはあなたがこれはより以上であるクエリ上の任意の変化を聞くと、フィルタ

    for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 
        Map<String, String> map = (Map<String, String>) childSnapshot.getValue(); 
        Buyers buyerList = new Buyers(map); 
        filteredUsernames.add(buyerList.getData()); 
    } 
    
    searchModule.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
        @Override 
        public boolean onQueryTextSubmit(String query) { 
         return false; 
        } 
    
        @Override 
        public boolean onQueryTextChange(String newText) { 
         filteredArrayAdapter.getFilter().filter(newText); 
         filteredArrayAdapter.notifyDataSetChanged(); 
         return true; 
        } 
    }); 
    

を適用するために、リスナーを使用することができますfilteredArrayAdapter

  • 上でそれを使用する必要がありますそれはどのように見えるべきであるか少ない。ただし、フィルターがアダプターに適用されているので、filteredUserNamesとmUsernamesが同じであることに気がつくので、実際には2つのリストは必要ありません。また、フィルタが必要な場合は、if文とcontainsチェックを使用してフィルタを手動で実行することもできます。

  • +0

    私はあなたのコードを試しましたが、これは意図したとおりにListViewを提供しますが、何も検索できません。何か案は? – Michael

    +0

    検索部分を紛失しました。編集部分が追加されました。基本的には、リスナーを使用して変更をリッスンし、フィルターを更新できるはずです。私はコードを試していない、それでも動作する必要があります。また、実際にアダプタにフィルタを適用し、データセットを変更しないので、notifyDataSetChangeは実際には必要ではありません。 – merterpam

    関連する問題