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

时间:2016-12-19 13:14:26

标签: android firebase android-recyclerview firebase-realtime-database firebaseui

我正在使用Firebase Recycler Adapter(Firebase用户界面库)来填充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());
}

它隐藏了LinearLayout,但行仍留有空格。

我是否应该覆盖任何方法来克服这个问题,或者有什么方法可以达到结果?

9 个答案:

答案 0 :(得分:50)

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

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,如果您更改属性并且永远不会将它们返回到自然状态,则在重用相同视图的情况下,其他元素将被隐藏。

答案 1 :(得分:23)

您应该隐藏UsersViewholder layout xml中的所有视图或父级。

VISIBLE

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

答案 2 :(得分:20)

如果

view.setVisibility(View.GONE);
  

为您提供空白视图

然后按照这个。

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

答案 3 :(得分:3)

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

    ....
}

答案 4 :(得分:1)

如果您隐藏整个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问题。

答案 5 :(得分:1)

“已消失”不会删除该项目所占用的空间...。您可以使用

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

在“ onBindViewHolder”内部

答案 6 :(得分:0)

public class OfferViewHolder extends RecyclerView.ViewHolder {
    public TextView textViewOfferName;
    public LabelImageView labelImageView;
    public TextView textViewOldPrice;
    public TextView textViewNewPrice;
    public TextView textViewShopName;
    public TextView textViewTimeDate;
    public TextView textViewDistance;

    public LinearLayout linearLayoutMain;


    public OfferViewHolder(View view) {
        super(view);
        linearLayoutMain=(LinearLayout) view.findViewById(R.id.ll_main);
        textViewOfferName = (TextView) view.findViewById(R.id.textViewoffername);
        labelImageView=(LabelImageView) view.findViewById(R.id.labelImageView) ;
        textViewOldPrice=(TextView) view.findViewById(R.id.textViewOldPrice);
        textViewNewPrice=(TextView) view.findViewById(R.id.textViewNewPrice);
        textViewShopName=(TextView) view.findViewById(R.id.textViewShopName);
        textViewTimeDate=(TextView) view.findViewById(R.id.textViewDate);
        textViewDistance=(TextView) view.findViewById(R.id.textViewDistance);

        linearLayoutMain.setVisibility(View.GONE);
        textViewOfferName.setVisibility(View.GONE);
        labelImageView.setVisibility(View.GONE);
        textViewOldPrice.setVisibility(View.GONE);
        textViewNewPrice.setVisibility(View.GONE);
        textViewShopName.setVisibility(View.GONE);
        textViewTimeDate.setVisibility(View.GONE);
        textViewDistance.setVisibility(View.GONE);



    }


}`enter code here`

然后在你的适配器中

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

                        }

谢谢lorescuGeorgeCătălin和Dhalav

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

我不推荐将 View 的高度和宽度设置为 0 的答案,因为适配器仍然需要渲染它们,如果隐藏项目太多会导致延迟,最好更改列表本身,然后将其发送到适配器