如何在特定条件下隐藏Recycler View中的项目?

Dha*_*val 38 android firebase android-recyclerview firebase-realtime-database firebaseui

我正在使用Firebase Recycler Adapter(Firebase UI库)来填充Recycler View.我想在条件上隐藏项目(行).我有一个包含回收者视图的LinearLayout.

我在populateViewHolder()循环器视图适配器的方法中将线性布局可见性设置为Gone .

@Override
protected void populateViewHolder(UsersViewHolder viewHolder, User user, int position) {

    if (user.getUserEmail().equals(Utils.decodeEmail(userEmail))) {
        viewHolder.llMain.setVisibility(View.GONE);
        return;
    }

    viewHolder.tvUserEmail.setText(user.getUserEmail());
}
Run Code Online (Sandbox Code Playgroud)

它隐藏了LinearLayout,但行仍留有空白.

是否有任何方法我应该覆盖以克服这个或有什么方法来实现结果?

inc*_*ito 74

在某些情况下,仅更改可见性属性可能仍然最终为已分配的空白区域(因为父视图的填充,边距,内部元素等).然后更改父视图的高度有助于:

holder.itemView.setVisibility(View.GONE); 
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解决方案就像一个魅力. (4认同)
  • 虽然它对线性回收器视图很有用,但不能去除网格回收器视图中的空闲空间 (2认同)
  • 这有效,但我使用的是网格回收器视图,中间有一两个空白单元格。 (2认同)
  • 别忘了在相反的情况下将视图的可见性恢复为VISIBLE&LayoutParams的初始状态。 ); (2认同)
  • 太棒了。 (2认同)
  • 如果这样做会导致崩溃!确保您尝试“ params = itemView.getLayoutParams()”,然后在该params对象上设置宽度/高度。之后:“ itemView.setLayoutParams(params)”。 (2认同)

Flo*_*lin 27

您应该隐藏UsersViewholder布局xml中的所有视图或父级.

itemView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

但是别忘了设置它们VISIBLE,你最终会收到回收中的一些奇怪的东西

  • 很抱歉,但是,一旦项目的大小增加,问题再次出现并且再次出现空格。我应该怎么做才能解决问题? (3认同)
  • 隐藏所有项目,包括父母、卡片。我遇到了同样的问题,但我解决了阻止所有项目的问题。 (2认同)

Sam*_*dal 25

如果

view.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

给你一个空白视图

然后按照这个.

public static class Data_ViewHolder extends RecyclerView.ViewHolder {
    private final LinearLayout layout;
    final LinearLayout.LayoutParams params;

    public Show_Chat_ViewHolder(final View itemView) {
        super(itemView);
        .
        .
        .
        layout =(LinearLayout)itemView.findViewById(R.id.show_item_layout);
        params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT);
        .
        .
        .
    }

    private void Layout_hide() {
        params.height = 0;
        //itemView.setLayoutParams(params); //This One.
        layout.setLayoutParams(params);   //Or This one.

    }
  }
Run Code Online (Sandbox Code Playgroud)

现在从适配器调用

mFirebaseAdapter = new FirebaseRecyclerAdapte......{
public void populateViewHolder.....{

if(model.getData().equals("..Something.."))
  {
      viewHolder.Layout_hide();
  }
else
      viewHolder.Person_Email(model.getEmail());
   }
 }
Run Code Online (Sandbox Code Playgroud)


Far*_*tab 5

在 RecyclerView 中没有内置的方法来隐藏子项。但您可以在适配器中实现此功能。

public class MyAdapter extends RecyclerView.Adapter<...>{
    List<Object> items;
    Map<Integer,Object> deletedItems;
    ...

    public void hideItem(final int position) {
         deletedItems.add(position, items.get(position));
         items.remove(position);
         notifyItemRemoved(position);
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)


Suv*_*tra 5

如果您隐藏整个 itemView 并面临空格问题。

试试这个来隐藏 itemView。

holder.itemView.setVisibility(View.GONE);
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = 0;
params.width = 0;
holder.itemView.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

这是为了显示它。

holder.itemView.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

这是一个 recyclerView,因此在 if else 块中同时使用两者,否则您可能会遇到一些意外的 UI 问题。


小智 5

“GONE”不会删除项目占用的空间......你可以使用

if (condition) {
         item.layoutParams.height = 0
         item.layoutParams.width = 0
}
Run Code Online (Sandbox Code Playgroud)

在“onBindViewHolder”里面

  • 您应该在 else 语句中重新设置高度和宽度! (2认同)