Android:如何在Firebase RecyclerView中使用条件DataSnapshot值?
我试图查询Firebase并使用查询的DataSnapshot中的条件数据填充回收器适配器。我尝试将populate函数放在if语句中,该语句可以正确记录我想要的数据,但是recycler视图只返回我搜索的节点(我开始的主查询)中的所有内容。关于如何只填充应用于“if”语句的项,有什么建议吗?谢谢大家!Android:如何在Firebase RecyclerView中使用条件DataSnapshot值?,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,我试图查询Firebase并使用查询的DataSnapshot中的条件数据填充回收器适配器。我尝试将populate函数放在if语句中,该语句可以正确记录我想要的数据,但是recycler视图只返回我搜索的节点(我开始的主查询)中的所有内容。关于如何只填充应用于“if”语句的项,有什么建议吗?谢谢大家! rootRef = FirebaseDatabase.getInstance().getReference(); //below is the node i query
rootRef = FirebaseDatabase.getInstance().getReference();
//below is the node i query
mAlbumQuery = rootRef.child(Constants.FIREBASE_CHILD_ALBUMS).orderByChild("genres");
mAlbumQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot reco : dataSnapshot.getChildren()) {
if (reco.getValue().toString().contains(mRecommendation.getGenre())) {
//below returns the items i want
Log.d("is this correct", reco.getValue().toString());
//below returns everything in the original query
//how to populate only items that match the above?
mAdapter = new FirebaseRecyclerAdapter<Album, AlbumsViewHolder>(
Album.class,
R.layout.album_cards,
AlbumsViewHolder.class,
mAlbumQuery) {
@Override
public void populateViewHolder(AlbumsViewHolder holder, Album album, int position) {
holder.bindView(album.getImage(), album.getTitle());
if (!album.getGenres().contains(mRecommendation.getGenre())) {
//added as a hypothetical... should i have something in here?
}
}
};
mAlbumsRecycler.setAdapter(mAdapter);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return view;
}
rootRef=FirebaseDatabase.getInstance().getReference();
//下面是我查询的节点
mAlbumQuery=rootRef.child(Constants.FIREBASE\u child\u ALBUMS).orderByChild(“流派”);
addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot记录:DataSnapshot.getChildren()){
if(reco.getValue().toString().contains(mRecommendation.getgreen())){
//下面返回我想要的项目
Log.d(“这是否正确”,reco.getValue().toString());
//下面返回原始查询中的所有内容
//如何仅填充与上述内容匹配的项目?
mAdapter=新的FirebaseRecyclerAdapter(
专辑类,
R.layout.album_卡,
AlbumsViewolder.class,
马尔布姆(查询){
@凌驾
public void populateViewHolder(相册viewholder,相册相册,int位置){
holder.bindView(album.getImage(),album.getTitle());
如果(!album.getGenres().包含(mRecommendation.getGenres())){
//作为假设添加…我应该在这里有东西吗?
}
}
};
mAlbumsRecycler.setAdapter(mAdapter);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
返回视图;
}
如果要提取任何特定节点,您可以使用以下命令:-
String notific = String.valueOf(dataSnapshot.getValue());
int key=dataSnapshot.getKey();
String title=String.valueOf(dataSnapshot.child("title").getValue());
String content=String.valueOf(dataSnapshot.child("content").getValue());
如果您想提取任何特定节点,您可以使用:
String notific = String.valueOf(dataSnapshot.getValue());
int key=dataSnapshot.getKey();
String title=String.valueOf(dataSnapshot.child("title").getValue());
String content=String.valueOf(dataSnapshot.child("content").getValue());
嗯,如果您将
mAlbumQuery
作为param发送到您的FirebaseRecyclerAdapter
,我相信它的大小就是项目数
作为一个选项(用于快速修复),您可以在此循环中创建新集合和:
for (DataSnapshot reco : dataSnapshot.getChildren()) {
}
您可以用所需的项目填充新集合。循环之后,您可以创建新适配器并将筛选后的集合传递给它 以下是我的看法:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Collection<> myNewCollection = new Collection<>(); //HashMap, ArrayList - depends on what you are storing in Firebase
for (DataSnapshot reco : dataSnapshot.getChildren()) {
if (reco.getValue().toString().contains(mRecommendation.getGenre())) {
//below returns the items i want
Log.d("is this correct", reco.getValue().toString());
//below returns everything in the original query
//how to populate only items that match the above?
myNewCollection.add(reco.getValue);
}
}
recyclerView.setAdapter(new MyRecyclerViewAdapter(myNewCollection, ...));
}
@覆盖
公共void onDataChange(DataSnapshot DataSnapshot){
Collection myNewCollection=new Collection();//HashMap,ArrayList-取决于您在Firebase中存储的内容
对于(DataSnapshot记录:DataSnapshot.getChildren()){
if(reco.getValue().toString().contains(mRecommendation.getgreen())){
//下面返回我想要的项目
Log.d(“这是否正确”,reco.getValue().toString());
//下面返回原始查询中的所有内容
//如何仅填充与上述内容匹配的项目?
myNewCollection.add(reco.getValue);
}
}
setAdapter(新的MyRecyclerViewAdapter(myNewCollection,…);
}
另外,请查看和。有一些有趣的方法-
startAt
、endAt
和equalTo
,它们可能会对您有所帮助。不幸的是,我没有发现方法包含,但上面的方法可能就足够了。好吧,如果您将mAlbumQuery
作为参数发送到FirebaseRecyclerAdapter
,我相信它的大小与项目数相同
作为一个选项(用于快速修复),您可以在此循环中创建新集合和:
for (DataSnapshot reco : dataSnapshot.getChildren()) {
}
您可以用所需的项目填充新集合。
循环之后,您可以创建新适配器并将筛选后的集合传递给它
以下是我的看法:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Collection<> myNewCollection = new Collection<>(); //HashMap, ArrayList - depends on what you are storing in Firebase
for (DataSnapshot reco : dataSnapshot.getChildren()) {
if (reco.getValue().toString().contains(mRecommendation.getGenre())) {
//below returns the items i want
Log.d("is this correct", reco.getValue().toString());
//below returns everything in the original query
//how to populate only items that match the above?
myNewCollection.add(reco.getValue);
}
}
recyclerView.setAdapter(new MyRecyclerViewAdapter(myNewCollection, ...));
}
@覆盖
公共void onDataChange(DataSnapshot DataSnapshot){
Collection myNewCollection=new Collection();//HashMap,ArrayList-取决于您在Firebase中存储的内容
对于(DataSnapshot记录:DataSnapshot.getChildren()){
if(reco.getValue().toString().contains(mRecommendation.getgreen())){
//下面返回我想要的项目
Log.d(“这是否正确”,reco.getValue().toString());
//下面返回原始查询中的所有内容
//如何仅填充与上述内容匹配的项目?
myNewCollection.add(reco.getValue);
}
}
setAdapter(新的MyRecyclerViewAdapter(myNewCollection,…);
}
另外,请查看和。
有一些有趣的方法-startAt
、endAt
和equalTo
,它们可能会对您有所帮助。不幸的是,我没有发现方法包含,但上面的方法可能就足够了。是的,我想我意识到mAlbumQuery需要更改。。。我只是想弄清楚什么应该取代它,我想,或者也许我用另一种方式来处理这个问题。我不确定。我应该在哪里创建您提到的新收藏?谢谢,我今天将对此进行研究,并让您了解它的进展情况。对象上不存在Contains,这就是为什么我必须首先执行toString。我正在搜索字符串属性中的特定关键字,并尝试只返回那些具有该关键字的关键字。是的,我想我意识到mAlbumQuery需要更改。。。我只是想弄清楚应该用什么来取代它,我想,或者也许我会用d来代替它