Android - 如何过滤Firebase的RecyclerView?

时间:2017-08-30 17:26:07

标签: android firebase firebase-authentication

我最近在我的Android Firebase应用中添加了一个searchBar,但我真的找不到如何在我的应用中过滤数据。我需要在“标题”,“desc”和“用户名”中搜索,如下所示 photo.

我该怎么办?感谢

[随机字母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

1 个答案:

答案 0 :(得分: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

    )

要了解更多信息,您可以在此处查看文档:{​​{3}}

和FirebaseUI文档:https://firebase.google.com/docs/reference/android/com/google/firebase/database/Query

这就是我所做的:

@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

        )