Android 如何在特定条件下从回收器视图中隐藏项目?

Android 如何在特定条件下从回收器视图中隐藏项目?,android,firebase,android-recyclerview,firebase-realtime-database,firebaseui,Android,Firebase,Android Recyclerview,Firebase Realtime Database,Firebaseui,我正在使用Firebase回收器适配器(Firebase UI库)填充回收器视图。我想根据条件隐藏项目(行)。 我有一个包含回收者视图的线性布局 我将线性布局可见性设置为进入回收器视图适配器的populateViewHolder()method @Override protected void populateViewHolder(UsersViewHolder viewHolder, User user, int position) { if (user.getUserEmail()

我正在使用Firebase回收器适配器(Firebase UI库)填充回收器视图。我想根据条件隐藏项目(行)。 我有一个包含回收者视图的线性布局

我将线性布局可见性设置为进入回收器视图适配器的
populateViewHolder()
method

@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());
}
它隐藏LinearLayout,但行仍保留空白


有没有什么方法可以克服这个问题,或者有什么方法可以实现这个结果?

您应该隐藏所有视图或父视图,不让用户查看文件夹布局xml。 您应该隐藏整个viewholder或每个视图

整个视图持有者:

itemView.setVisibility(View.GONE);
或每个元素:

view.setVisibility(View.GONE);

但是别忘了将它们设置为可见的,否则,回收会导致一些奇怪的结果。你应该隐藏所有视图或父视图,不让用户查看文件夹布局xml。 您应该隐藏整个viewholder或每个视图

整个视图持有者:

itemView.setVisibility(View.GONE);
或每个元素:

view.setVisibility(View.GONE);

但是别忘了将它们设置为可见的,否则,你会从回收中得到一些奇怪的东西

在回收视图中没有隐藏孩子的内置方法。 但您可以在适配器中实现此功能

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);
    }

    ....
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 清单项目; 地图删除项; ... 公共无效隐藏项(最终整型位置){ deletedItems.add(position,items.get(position)); 项目。移除(位置); 已移除(位置)的项目; } .... }
在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);
    }

    ....
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 清单项目; 地图删除项; ... 公共无效隐藏项(最终整型位置){ deletedItems.add(position,items.get(position)); 项目。移除(位置); 已移除(位置)的项目; } .... } 然后在适配器中

 if (a.equals(offer.getOfferCategory())) {


                        if (offer.getOfferCategory()==null){
//                            chatMessageViewHolder.getLinearLayoutMain().setVisibility(View.GONE);
//                            chatMessageViewHolder.linearLayoutMain.setLayoutParams(new RecyclerView.LayoutParams(0, 0));


                        }
                        else {
                            chatMessageViewHolder.itemView.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewShopName.setText(offer.getOfferCategory());
                            chatMessageViewHolder.linearLayoutMain.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewOfferName.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.labelImageView.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewOldPrice.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewNewPrice.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewShopName.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewTimeDate.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewDistance.setVisibility(View.VISIBLE);

                        }
谢谢洛雷斯库·乔治·切特林和达拉夫

然后在适配器中

 if (a.equals(offer.getOfferCategory())) {


                        if (offer.getOfferCategory()==null){
//                            chatMessageViewHolder.getLinearLayoutMain().setVisibility(View.GONE);
//                            chatMessageViewHolder.linearLayoutMain.setLayoutParams(new RecyclerView.LayoutParams(0, 0));


                        }
                        else {
                            chatMessageViewHolder.itemView.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewShopName.setText(offer.getOfferCategory());
                            chatMessageViewHolder.linearLayoutMain.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewOfferName.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.labelImageView.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewOldPrice.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewNewPrice.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewShopName.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewTimeDate.setVisibility(View.VISIBLE);
                            chatMessageViewHolder.textViewDistance.setVisibility(View.VISIBLE);

                        }
谢谢洛雷斯库·乔治·切特林和达拉夫如果 给你一个空白视图

然后按照这个

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.

    }
  }
现在从适配器调用

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

if(model.getData().equals("..Something.."))
  {
      viewHolder.Layout_hide();
  }
else
      viewHolder.Person_Email(model.getEmail());
   }
 }
如果 给你一个空白视图

然后按照这个

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.

    }
  }
现在从适配器调用

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

if(model.getData().equals("..Something.."))
  {
      viewHolder.Layout_hide();
  }
else
      viewHolder.Person_Email(model.getEmail());
   }
 }

在某些情况下,仅更改“可见性”属性可能仍然会导致分配的空白(因为父视图的填充、边距、内部元素等)。然后,更改父视图的高度有助于:

holder.itemView.setVisibility(View.GONE); 
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
然后确保在其应可见的条件下,还设置:

holder.itemView.setVisibility(View.VISIBLE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

您需要这样做,因为当您滚动时,viewHolder会被循环使用,如果您这样更改属性,并且从不将其返回到自然状态,则其他元素在重复使用同一视图的情况下将被隐藏。

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

holder.itemView.setVisibility(View.GONE); 
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
然后确保在其应可见的条件下,还设置:

holder.itemView.setVisibility(View.VISIBLE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

您需要这样做,因为viewHolder在您滚动时会被回收,如果您这样更改属性,并且从不将其返回到自然状态,那么如果其他元素重复使用同一视图,则其他元素将被隐藏。

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

尝试此操作以隐藏itemView

holder.itemView.setVisibility(View.GONE);
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = 0;
params.width = 0;
holder.itemView.setLayoutParams(params);
这就是我要展示的

holder.itemView.setVisibility(View.VISIBLE);

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

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

尝试此操作以隐藏itemView

holder.itemView.setVisibility(View.GONE);
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = 0;
params.width = 0;
holder.itemView.setLayoutParams(params);
这就是我要展示的

holder.itemView.setVisibility(View.VISIBLE);
这是一个recyclerView,因此请在if-else块中同时使用这两个选项,否则您可能会遇到一些意外的UI问题。

“GONE”将不会删除项目占用的空间…您可以使用

if (condition) {
         item.layoutParams.height = 0
         item.layoutParams.width = 0
}
在“onBindViewHolder”内部,“GONE”不会删除项目占用的空间…您可以使用

if (condition) {
         item.layoutParams.height = 0
         item.layoutParams.width = 0
}

在“onBindViewHolder”内部

holder.itemView.setVisibility(View.VISIBLE);现在不工作。我正在使用它

holder.itemView.findViewById(R.id.card).setVisibility(View.GONE)


您可以轻松地将ViewHolder值发送到操作函数。

holder.itemView.setVisibility(View.VISIBLE);现在不工作。我正在使用此

holder.itemView.findViewById(R.id.card).setVisibility(View.GONE)


您可以轻松地将ViewHolder值发送到操作函数。

我不建议将“视图的高度和宽度”设置为0的答案,因为适配器仍然需要渲染它们,如果隐藏项太多,这可能会导致延迟,最好更改列表本身,然后将其发送到适配器。

我不建议使用ansWER将视图的高度和宽度设置为0,因为适配器仍然需要渲染它们,如果隐藏的项目太多,这可能会导致延迟,最好更改列表本身,然后将其发送到适配器

最好在不需要项目的情况下填充数据。如果主题注释:如果没有
其他,则您的
也可以…它将在以后踢你的屁股(与视图重用相关)我同意塞尔文的观点,但也许身高=0就可以了trick@Selvin是的,我稍后会添加else部分。但是我使用Firebase回收器适配器,所以我只提供节点的引用,而不是任何数据。是否缺少任何要实现的内容?请检查我在这篇文章中的答案。最好在填充数据时不使用top中不需要的项目ic评论:还有你的
如果
没有
其他
…你会在以后踢屁股(与视图重用相关)我同意塞尔文的观点,但可能身高=0就可以了trick@Selvin是的,我稍后会添加else部分。但我使用的是Firebase回收器适配器,所以我只是pr