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



我正在使用firebase回收器适配器(firebase ui库)来填充回收器视图。我想在条件下隐藏一个项目(行)。我有一个包含回收器视图的线层。

i将线性布局可见性设置为populateViewHolder()回收器视图适配器的消失。

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

它隐藏了线度层,但行留在空白处。

我应该覆盖任何方法来克服这一点,还是有任何方法可以实现结果?

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

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

您需要这样做,因为滚动时视图持有人会被回收,如果您更改属性并且永远不会将它们返回其自然状态,那么如果他们重复使用相同的视图,其他元素就会被隐藏。

您应该隐藏所有视图或parents xml的所有视图或父。您应该隐藏整个视图持有人或每个视图

整个视图持有人:

itemView.setVisibility(View.GONE);

或每个元素:

view.setVisibility(View.GONE);

但不要忘记将它们设置为VISIBLE否则,您最终会从回收中得到一些奇怪的事情

如果

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.
    }
  }

现在从 adapter

来调用
mFirebaseAdapter = new FirebaseRecyclerAdapte......{
public void populateViewHolder.....{
if(model.getData().equals("..Something.."))
  {
      viewHolder.Layout_hide();
  }
else
      viewHolder.Person_Email(model.getEmail());
   }
 }

如果您隐藏了整个项目视图并面对空格的问题。

尝试隐藏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);

这是一个回收库,因此在其他块中都使用两者都会遇到一些意外的UI问题。

没有内置的方式将孩子隐藏在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);
    }
    ....
}

;不会删除物品所占用的空间。...您可以使用

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

内部" onbindviewholder"

似乎内部caches root视图信息,因此更改其可见性无济于事。

用framelayout包装RV项目视图,然后设置视图。这样可以正确清除后的空间,并且根本不会显示项目。

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

holder.itemview.setviebibilible(view.visible);现在不起作用。我正在使用这个

holder.itemview.findviewbyid(r.id.card).setVisibilible(view.gone);

您可以轻松地将视图持有人值发送到您的操作功能。

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

private fun hideShowItemView(itemView: View, toShow: Boolean) {
        itemView.isVisible = toShow
        itemView.layoutParams.height = if (toShow) ViewGroup.LayoutParams.WRAP_CONTENT else 0
 }
  1. ItemView是视图持有人的ItemView
  2. Toshow是隐藏或展示Recyclerview项目的布尔

根据要求,在OnBindViewHolder块中使用以下代码,

To hide Item : hideShowItemView(holder.itemView, false)
To show Item : hideShowItemView(holder.itemView, true)

相关内容

最新更新