android - 当我使用 FirebaseRecyclerAdapter 时如何在回收器视图中隐藏空行
问题描述
我在社交应用中有大量帖子。我正在使用 FirebaseRecyclerAdapter,它直接从 firebase 获取结果并监听在 firebase 实时数据库上所做的任何数据更改。我不需要所有帖子,当我在帖子上设置一些条件时,它会正确显示相关帖子,但那些不满足视图在其位置显示的条件的帖子。就像它的显示空列表项,如果条件未满足,如果条件满足,则显示带有数据的列表项。我想从不满足条件的列表中删除列表项。下面是我的代码。我有一个字符串数组,其中包含正在关注的业务用户的 id。Post iteam 包含一个企业 id,现在如果 post 的企业 id 与企业数组 post 的 id 匹配,则应该显示其他明智的不。
Query dbQuery = FirebaseDatabase.getInstance().getReference().child("new").child("BusinessPosts").orderByChild("timeStamp");
FirebaseRecyclerOptions<PostMC> options = new FirebaseRecyclerOptions.Builder<PostMC>()
.setQuery(dbQuery, PostMC.class).build();
firebasePostAdapter = new FirebaseRecyclerAdapter<PostMC, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final PostsViewHolder holder, final int position, @NonNull final PostMC postMC) {
if (followingBusinessesList.contains(postMC.getBusinessID())) {
if (source.equals("BPF") || (source.equals("BHF"))) {
sharedByDBRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(mAuth.getCurrentUser().getUid()).hasChild(postMC.getPostID())) {
holder.shares.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_post_share_colored, 0, 0, 0);
} else {
holder.shares.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_post_share, 0, 0, 0);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
likedByDBRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(mAuth.getCurrentUser().getUid()).hasChild(postMC.getPostID())) {
holder.likes.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_liked, 0, 0, 0);
} else {
holder.likes.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_like, 0, 0, 0);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
holder.likes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mProcessLike = true;
final int postLikes = Integer.parseInt(String.valueOf(postMC.getPostLikes()));
likedByDBRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (mProcessLike) {
if (dataSnapshot.child(mAuth.getCurrentUser().getUid()).hasChild(postMC.getPostID())) {
businessPostsRef.child(postMC.getPostID()).child("postLikes").setValue("" + (postLikes - 1));
likedByDBRef.child(mAuth.getCurrentUser().getUid()).child(postMC.getPostID()).removeValue();
likedToDBRef.child(postMC.getPostID()).child(mAuth.getCurrentUser().getUid()).removeValue();
holder.likes.setText(postMC.getPostLikes());
mProcessLike = false;
} else {
businessPostsRef.child(postMC.getPostID()).child("postLikes").setValue("" + (postLikes + 1));
likedByDBRef.child(mAuth.getCurrentUser().getUid()).child(postMC.getPostID()).setValue("Liked");
likedToDBRef.child(postMC.getPostID()).child(mAuth.getCurrentUser().getUid()).setValue("Like");
holder.likes.setText(postMC.getPostLikes());
mProcessLike = false;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
holder.userImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!mAuth.getCurrentUser().getUid().equals(postMC.getBusinessID())) {
Intent intent = new Intent(getActivity(), ViewBusinessProfileActivity.class);
intent.putExtra("businessID", postMC.getBusinessID());
startActivity(intent);
}
}
});
holder.profileLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!mAuth.getCurrentUser().getUid().equals(postMC.getBusinessID())) {
Intent intent = new Intent(getActivity(), ViewBusinessProfileActivity.class);
intent.putExtra("businessID", postMC.getBusinessID());
startActivity(intent);
}
}
});
Calendar calendar = Calendar.getInstance(Locale.getDefault());
calendar.setTimeInMillis(Long.parseLong(postMC.getPostTime()));
PrettyTime prettyTime = new PrettyTime(Locale.getDefault());
String ago = prettyTime.format(calendar);
holder.sub.setText(postMC.getPostMessage());
holder.time.setText(ago);
holder.shares.setText(postMC.getPostShares());
holder.likes.setText(postMC.getPostLikes());
holder.main.setText(postMC.getBusinessName());
Glide.with(getActivity()).load(postMC.getBusinessImageUrl()).into(holder.userImage);
if (postMC.getPostImage().equals("")) {
holder.postImage.setVisibility(View.GONE);
} else {
Glide.with(getActivity()).load(postMC.getPostImage()).into(holder.postImage);
}
} else {
}
}
@NonNull
@Override
public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_single_post, viewGroup, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
userPostsRV.setAdapter(firebasePostAdapter);
firebasePostAdapter.startListening();
解决方案
您可以通过将可见性设置为“GONE”来隐藏其他部分中的整个视图。在您的 else 部分中添加以下内容。
if(followingBusinessesList.contains(postMC.getBusinessID())) {
...
}
else{
holder.itemView.setVisibility(View.GONE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
}
推荐阅读
- python - 如何从 DOM 上无法立即使用的 React Modal Portal 元素中抓取数据?
- html - 图像未填充包含元素
- html - 如何在网页上 iframe web whatsapp
- c# - 如何从数据库中的列中计算字符长度并将它们放入 datagridview 中显示的新列中
- server - PHP版本升级不影响共享主机中的其他主机
- apache-spark - Zeppelin java.io.IOException:作业因阶段失败而中止:连接已关闭
- java - Sever Sent Event IOException 导致无法捕获的 IllegalStateException
- javascript - 无法使用 ng-class 更改课程
- elasticsearch - X-Pack,开源还是付费?
- c - 字符串作为函数指针的参数