2017-10-06 1 views
0

목록보기에 데이터를 표시 할 수있는 Firebase 데이터베이스가 있습니다. 모든 데이터는 오브젝트에 포함되어 데이터를 가져옵니다. 예를 들어 "Lars"를 검색 창에 쓸 수있게하려면 목록에있는 모든 내용을 검색 창에서 삭제하면 해당 문자열을 포함하는 객체 만 포함하도록 목록 뷰를 업데이트해야합니다. 첫 번째 for 루프가 작동하고 두 번째 for 루프가 데이터 검색을 시도합니다. 내 중포 기지의 구조는 다음과 같습니다 enter image description hereAndroid에서 Listview를 사용하여 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

세 가지 :

  1. 당신은 filteredUsernames에 데이터를 추가하지 마십시오을. mUsernames와 마찬가지로 데이터를 filteredUsernames에 추가해야합니다.
  2. getFilter 당신이

    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

  • 에 그것을 사용하고 적용해야합니다, ArrayAdapter와하는 방법입니다 더 많거나 어떻게 보일 것인가. 그러나 필터가 어댑터에 적용되었으므로 filteredUserNames와 mUsernames는 동일하므로 실제로 두 개의 목록이 필요하지 않습니다. 또는 필터가 필요한 경우 if 문과 contains 검사를 사용하여 수동으로 필터링을 수행 할 수도 있습니다.

    +0

    의도 한대로 ListView를 제공하는 코드를 시도했지만 아무 것도 검색 할 수 없습니다. 어떤 아이디어? – Michael

    +0

    검색 부분을 놓치면 편집 부분이 추가됩니다. 기본적으로 리스너를 사용하여 변경 사항을 수신하고 필터를 업데이트 할 수 있어야합니다. 코드를 시도하지 않았지만 여전히 작동해야합니다. 또한 실제로 어댑터에 필터를 적용하고 데이터 집합을 변경하지 않으므로 notifyDataSetChange가 실제로 필요하지 않을 수도 있습니다. – merterpam

    관련 문제