2017-08-30 79 views
0

我最近在我的Android Firebase應用中添加了一個searchBar,但我實際上找不到如何在我的應用中過濾數據。我需要在「標題」,「desc」和「用戶名」孩子中搜索,如 photo.Android - 如何過濾Firebase的RecyclerView?

我該怎麼辦?由於

[隨機字母hsiukhdufhjwrepjèijgitrjwbnrtnbnbeènbèrnbgnèjwtigogjwitjgbniownttngfnwnpnwpjgnjntwjtngjnjwngjggpnwrjgrngjwpnjnvwpjeenjrvnjpreqngjnpwjgnrjpwnjpn2ngj2nrjnp2r2g2hhuheqdhyg1eydgugf]


MainActivity的更新代碼:

public class MainActivity extends AppCompatActivity{ 

private RecyclerView mBlogList; 

private DatabaseReference mDatabase; 

private DatabaseReference mDatabaseUsers; 

private DatabaseReference mDatabaseLike; 

private Query mQuery; 

private SearchView mSearchView; 

private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 

private boolean mProcessLike = false; 

private TextView badge; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

      if(firebaseAuth.getCurrentUser() == null){ 


       Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class); 
       loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(loginIntent); 

      } 

     } 
    }; 


    mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog"); 
    mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users"); 
    mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 

    mDatabaseUsers.keepSynced(true); 
    mDatabaseLike.keepSynced(true); 
    mDatabase.keepSynced(true); 

    mBlogList = (RecyclerView) findViewById(R.id.blog_list); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 

    mBlogList.setHasFixedSize(true); 
    mBlogList.setLayoutManager(new LinearLayoutManager(this)); 

    badge = (TextView)findViewById (R.id.badge); 

    } 

@Override 
protected void onStart() { 
    super.onStart(); 

    mAuth.addAuthStateListener(mAuthListener); 

    final FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
      Blog.class, 
      R.layout.blog_row, 
      BlogViewHolder.class, 
      mQuery 

    ) { 
     @Override 
     protected void populateViewHolder(final BlogViewHolder viewHolder, Blog model, int position) { 

      final String post_key = getRef(position).getKey(); 

      viewHolder.setTitle(model.getTitle()); 
      viewHolder.setDesc(model.getDesc()); 
      viewHolder.setImage(getApplicationContext(), model.getImage()); 
      viewHolder.setUsername(model.getUsername()); 

      viewHolder.setLikeBtn(post_key); 

      viewHolder.mView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        Intent singleBlogIntent = new Intent(MainActivity.this, BlogSingleActivity.class); 
        singleBlogIntent.putExtra("blog_id", post_key); 
        startActivity(singleBlogIntent); 

       } 
      }); 

      mDatabaseUsers.child(model.getUid()).child("image").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        String imageUrl = dataSnapshot.getValue().toString(); 
        viewHolder.setUserimage(getApplicationContext(), imageUrl); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 


      viewHolder.mLikeBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        mProcessLike = true; 

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

          if (mProcessLike) { 

           if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) { 

            mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue(); 

            mProcessLike = false; 

           } else { 

            mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue("RandomValue"); 

            mProcessLike = false; 

           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 
      }); 
     } 
    }; 

    mBlogList.setAdapter(firebaseRecyclerAdapter); 
} 

private void checkUserExist() { 
    final String user_id = this.mAuth.getCurrentUser().getUid(); 
    this.mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (!dataSnapshot.hasChild(user_id)) { 
       Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class); 
       setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(setupIntent); 
       MainActivity.this.startActivity(setupIntent); 
      } 

      if (user_id == null){Intent errorIntent = new Intent (MainActivity.this, ErrorActivity.class); 
       errorIntent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(errorIntent); 
       MainActivity.this.startActivity (errorIntent); 
      }} 

     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 


public static class BlogViewHolder extends RecyclerView.ViewHolder{ 

    View mView; 

    ImageButton mLikeBtn; 

    DatabaseReference mDatabaseLike; 
    FirebaseAuth mAuth; 

    public BlogViewHolder(View itemView) { 
     super(itemView); 

     mView = itemView; 

     mLikeBtn = (ImageButton) mView.findViewById(R.id.like_btn); 

     mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 
     mAuth = FirebaseAuth.getInstance(); 

     mDatabaseLike.keepSynced(true); 




    } 

    public void setUserimage(Context context, String imageUrl) { 
     ImageView imageViewPostUserImage = (ImageView) mView.findViewById(R.id.imageview_post_userimage); 
     Glide 
       .with(context) 
       .load(imageUrl) 
       .into(imageViewPostUserImage); 
    } 

    public void setLikeBtn(final String post_key) { 

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

       if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) { 

        mLikeBtn.setImageResource(R.mipmap.ic_thumb_up_black_24dp); 

       } else { 

        mLikeBtn.setImageResource(R.mipmap.ic_thumb_up_white_24dp); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 



    public void setTitle(String title){ 

     TextView post_title = (TextView) mView.findViewById(R.id.post_title); 
     post_title.setText(title); 
    } 

    public void setDesc(String desc){ 

     TextView post_desc = (TextView) mView.findViewById(R.id.post_desc); 
     post_desc.setText(desc); 

    } 

    public void setUsername(String username){ 

     TextView post_username = (TextView) mView.findViewById(R.id.post_username); 
     post_username.setText(username); 

    } 

    public void setImage(Context ctx, String image){ 

     ImageView post_image = (ImageView) mView.findViewById(R.id.post_image); 
     Picasso.with(ctx).load(image).into(post_image); 
    } 



} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main_menu, menu); 

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 

      Intent searchIntent = new Intent(MainActivity.this, searchActivity.class); 
      searchIntent.putExtra("search", query); 
      startActivity(searchIntent); 
      return false; 

     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      //?????? 
      return true; 
     } 
    }); 

    return super.onCreateOptionsMenu(menu); 



} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if(item.getItemId() == R.id.action_add){ 

     startActivity(new Intent(MainActivity.this, PostActivity.class)); 

    } 

    if (item.getItemId() == R.id.action_logout){ 

     logout(); 

    } 

    return super.onOptionsItemSelected(item); 
} 

private void logout() { 

    mAuth.signOut(); 

} 

}


searchActivity

public class searchActivity extends AppCompatActivity{ 

private RecyclerView mBlogList; 

private DatabaseReference mDatabase; 

private DatabaseReference mDatabaseUsers; 

private DatabaseReference mDatabaseLike; 

private Query mQuery; 

private Query mQuerySearch; 

private SearchView mSearchView; 

private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 

private boolean mProcessLike = false; 

private TextView badge; 

private String search; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

      if(firebaseAuth.getCurrentUser() == null){ 


       Intent loginIntent = new Intent(com.fgvelectro.f.searchActivity.this, LoginActivity.class); 
       loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(loginIntent); 

      } 

     } 
    }; 


    mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog"); 
    search = getIntent().getExtras().getString("search"); 
    mQuerySearch = mDatabase.orderByChild("title").equalTo(search); 
    mAuth.addAuthStateListener(mAuthListener); 

    mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users"); 
    mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 

    mDatabaseUsers.keepSynced(true); 
    mDatabaseLike.keepSynced(true); 
    mDatabase.keepSynced(true); 

    mQuery = mDatabase.orderByChild("title").equalTo("try1"); 

    mBlogList = (RecyclerView) findViewById(R.id.blog_list); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 

    mBlogList.setHasFixedSize(true); 
    mBlogList.setLayoutManager(new LinearLayoutManager(this)); 

    badge = (TextView)findViewById (R.id.badge); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 

    FirebaseRecyclerAdapter<Blog, searchActivity.BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(

      Blog.class, 
      R.layout.blog_row, 
      searchActivity.BlogViewHolder.class, 
      mQuerySearch 

    ) { 
     @Override 
     protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) { 

     } 

     protected void populateViewHolder(final com.fgvelectro.f.MainActivity.BlogViewHolder viewHolder, Blog model, int position) { 

      final String post_key = getRef(position).getKey(); 

      viewHolder.setTitle(model.getTitle()); 
      viewHolder.setDesc(model.getDesc()); 
      viewHolder.setImage(getApplicationContext(), model.getImage()); 
      viewHolder.setUsername(model.getUsername()); 

      viewHolder.setLikeBtn(post_key); 

      viewHolder.mView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        Intent singleBlogIntent = new Intent(com.fgvelectro.f.searchActivity.this, BlogSingleActivity.class); 
        singleBlogIntent.putExtra("blog_id", post_key); 
        startActivity(singleBlogIntent); 

       } 
      }); 

      mDatabaseUsers.child(model.getUid()).child("image").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        String imageUrl = dataSnapshot.getValue().toString(); 
        viewHolder.setUserimage(getApplicationContext(), imageUrl); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 


      viewHolder.mLikeBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        mProcessLike = true; 

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

          if (mProcessLike) { 

           if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) { 

            mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue(); 

            mProcessLike = false; 

           } else { 

            mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue("RandomValue"); 

            mProcessLike = false; 

           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 
      }); 
     } 
    }; 

    mBlogList.setAdapter(firebaseRecyclerAdapter); 
} 

private void checkUserExist() { 
    final String user_id = this.mAuth.getCurrentUser().getUid(); 
    this.mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (!dataSnapshot.hasChild(user_id)) { 
       Intent setupIntent = new Intent(com.fgvelectro.f.searchActivity.this, SetupActivity.class); 
       setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(setupIntent); 
       com.fgvelectro.f.searchActivity.this.startActivity(setupIntent); 
      } 

      if (user_id == null){Intent errorIntent = new Intent (com.fgvelectro.f.searchActivity.this, ErrorActivity.class); 
       errorIntent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(errorIntent); 
       com.fgvelectro.f.searchActivity.this.startActivity (errorIntent); 
      }} 

     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 


public static class BlogViewHolder extends RecyclerView.ViewHolder{ 

    View mView; 

    ImageButton mLikeBtn; 

    DatabaseReference mDatabaseLike; 
    FirebaseAuth mAuth; 

    public BlogViewHolder(View itemView) { 
     super(itemView); 

     mView = itemView; 

     mLikeBtn = (ImageButton) mView.findViewById(R.id.like_btn); 

     mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 
     mAuth = FirebaseAuth.getInstance(); 

     mDatabaseLike.keepSynced(true); 




    } 

    public void setUserimage(Context context, String imageUrl) { 
     ImageView imageViewPostUserImage = (ImageView) mView.findViewById(R.id.imageview_post_userimage); 
     Glide 
       .with(context) 
       .load(imageUrl) 
       .into(imageViewPostUserImage); 
    } 

    public void setLikeBtn(final String post_key) { 

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

       if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) { 

        mLikeBtn.setImageResource(R.mipmap.ic_thumb_up_black_24dp); 

       } else { 

        mLikeBtn.setImageResource(R.mipmap.ic_thumb_up_white_24dp); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 



    public void setTitle(String title){ 

     TextView post_title = (TextView) mView.findViewById(R.id.post_title); 
     post_title.setText(title); 
    } 

    public void setDesc(String desc){ 

     TextView post_desc = (TextView) mView.findViewById(R.id.post_desc); 
     post_desc.setText(desc); 

    } 

    public void setUsername(String username){ 

     TextView post_username = (TextView) mView.findViewById(R.id.post_username); 
     post_username.setText(username); 

    } 

    public void setImage(Context ctx, String image){ 

     ImageView post_image = (ImageView) mView.findViewById(R.id.post_image); 
     Picasso.with(ctx).load(image).into(post_image); 
    } 



} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main_menu, menu); 

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 

      Intent searchIntent = new Intent(com.fgvelectro.f.searchActivity.this, searchActivity.class); 
      searchIntent.putExtra("search", query); 
      startActivity(searchIntent); 
      return false; 

     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      //?????? 
      return true; 
     } 
    }); 

    return super.onCreateOptionsMenu(menu); 



} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if(item.getItemId() == R.id.action_add){ 

     startActivity(new Intent(com.fgvelectro.f.searchActivity.this, PostActivity.class)); 

    } 

    if (item.getItemId() == R.id.action_logout){ 

     logout(); 

    } 

    return super.onOptionsItemSelected(item); 
} 

private void logout() { 

    mAuth.signOut(); 

} 

} 照片:Of the error

回答

0

首先,你需要查詢您的數據庫,例如

mQuery = mDatabase.orderByChild("Title").equalTo("your value")然後去你firebaseRecyclerAdapter並替換:

FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
      Blog.class, 
      R.layout.blog_row, 
      BlogViewHolder.class, 
      mDatabase 

    ) 

有:

final FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
      Blog.class, 
      R.layout.blog_row, 
      BlogViewHolder.class, 
      mQuery 

    ) 

要了解更多信息,你可以查看這裏的文檔:https://firebase.google.com/docs/reference/android/com/google/firebase/database/Query

和FirebaseUI文檔:https://github.com/firebase/FirebaseUI-Android

這是我做過什麼:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.main_menu, menu); 

     SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); 

     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 

       Intent searchIntent = new Intent(MainActivity.this, searchActivity.class); 
       searchIntent.putExtra("search", query); 
       startActivity(searchIntent); 
       return false; 

      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       //?????? 
       return true; 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 



    } 

,並在搜索活動:

String search = getIntent().getExtras().getString("search"); 
mQuerySearch = mDatabase.orderByChild("name").equalTo(search); 

FirebaseRecyclerAdapter<Classified, searchActivity.ClassifiedViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Classified, searchActivity.ClassifiedViewHolder>(

       Classified.class, 
       R.layout.classified_row, 
       searchActivity.ClassifiedViewHolder.class, 
       mQuerySearch 

     ) 
+0

評論是不適用於擴展討論或調試慶典會議;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/153455/discussion-on-answer-by-jean-eric-android-how-to-filter-the-recyclerview-of- FI)。如果您需要更新您的問題,請編輯它並執行此操作。如果您有後續問題,請提出新問題並鏈接到此問題以提供背景。 –