如何隐藏RecyclerView指定条目并消除其占位空白
解决RecyclerView隐藏当前用户后仍留空白的问题
你遇到的空白问题,根源是只是隐藏了ViewHolder的视图,但Adapter的数据集里依然包含当前用户的条目——RecyclerView会为这个已隐藏的条目保留布局空间,所以才会出现空白。正确的做法是从数据源层面直接过滤掉当前用户,而不是事后隐藏视图。
下面是具体的修改方案:
步骤1:构建过滤后的查询,排除当前用户
在初始化FirebaseRecyclerAdapter之前,我们对原数据库引用添加过滤条件,直接排除当前用户的ID:
// 替换原有的直接使用friendRequestsDatabaseReference Query filteredFriendRequestsQuery = friendRequestsDatabaseReference .orderByKey() .notEqualTo(current_user_id); // 过滤掉当前用户的条目
步骤2:用过滤后的查询初始化Adapter
把FirebaseRecyclerAdapter构造函数里的friendRequestsDatabaseReference替换成上面的filteredFriendRequestsQuery,这样Adapter的数据集里就不会包含当前用户的条目,自然不会产生空白。
步骤3:简化populateViewHolder逻辑
因为已经在查询阶段过滤掉了当前用户,所以可以去掉原来的if (!user_id.equals(current_user_id))判断和viewHolder.mView.setVisibility(View.GONE)代码,避免冗余逻辑。
优化后的完整onStart()代码
@Override public void onStart() { super.onStart(); // 构建过滤查询,排除当前用户 Query filteredFriendRequestsQuery = friendRequestsDatabaseReference .orderByKey() .notEqualTo(current_user_id); final FirebaseRecyclerAdapter<FriendRequests, RequestsFragment.FriendRequestsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<FriendRequests, FriendRequestsViewHolder>( FriendRequests.class, R.layout.users_single_layout, RequestsFragment.FriendRequestsViewHolder.class, filteredFriendRequestsQuery // 使用过滤后的查询 ) { @Override protected void populateViewHolder(final FriendRequestsViewHolder viewHolder, FriendRequests model, final int position) { final String user_id = getRef(position).getKey(); // 无需再判断当前用户,查询已过滤 usersDatabaseReference.child(user_id).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final String user_displayName = dataSnapshot.child("display_name").getValue().toString(); final String user_thumbImage = dataSnapshot.child("thumb_image").getValue().toString(); if (dataSnapshot.hasChild("online")) { String userOnline = dataSnapshot.child("online").getValue().toString(); viewHolder.setUserOnline(userOnline); } viewHolder.setName(user_displayName); viewHolder.setImage(user_thumbImage); viewHolder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent profileIntent = new Intent(getContext(), ProfileActivity.class); profileIntent.putExtra("user_id", user_id); startActivity(profileIntent); } }); } @Override public void onCancelled(DatabaseError databaseError) { // 可添加错误提示逻辑 } }); friendRequestsDatabaseReference.child(current_user_id).child(user_id).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.hasChild("request_type")) { String request_type = dataSnapshot.child("request_type").getValue().toString(); viewHolder.setRequest_type(request_type); } } @Override public void onCancelled(DatabaseError databaseError) { // 可添加错误提示逻辑 } }); } }; recyclerView_friendRequestsList.setAdapter(firebaseRecyclerAdapter); }
额外优化建议
- 把
addValueEventListener改成addListenerForSingleValueEvent:避免重复监听导致的内存泄漏和性能问题,因为我们只需要获取一次数据填充ViewHolder即可。 - 如果你的FirebaseUI版本较新,建议使用
FirebaseRecyclerOptions构建Adapter:这是更现代、灵活的用法,也更容易维护。
这样修改后,RecyclerView里就不会出现当前用户的条目,自然也不会有空白了。
内容的提问来源于stack exchange,提问作者f.knyr
相关产品推荐
相关产品推荐

