source

특정 조건에서 Recycler View에서 항목을 숨기는 방법은 무엇입니까?

bestscript 2023. 7. 19. 22:44

특정 조건에서 Recycler View에서 항목을 숨기는 방법은 무엇입니까?

Firebase Recycler Adapter(Firebase UI 라이브러리)를 사용하여 Recycler View를 채우고 있습니다.조건에 따라 항목(행)을 숨기려고 합니다.리사이클러 뷰가 포함된 선형 레이아웃이 있습니다.

in 선형웃가시으을성로로 했습니다.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));

경치가 보기 때문에 그렇게 해야 합니다.스크롤할 때 홀더가 재활용됩니다. 속성을 이와 같이 변경하고 원래 상태로 되돌리지 않으면 다른 요소가 동일한 뷰를 재사용할 경우 이미 숨겨집니다.

UsersViewholder 레이아웃 xml에서 모든 뷰 또는 상위 뷰를 숨겨야 합니다.전체 뷰홀더 또는 각 뷰를 숨겨야 합니다.

전체 뷰어:

itemView.setVisibility(View.GONE);

또는 각 요소:

view.setVisibility(View.GONE);

하지만 그것들을 설정하는 것을 잊지 마세요.VISIBLE은 재활용으로부터 될 입니다, ▁things▁otherwise다▁recycling▁end것▁from니입▁strange될▁up▁you▁some▁will.

한다면

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

전체 항목을 숨기고 빈 공간 문제에 직면한 경우

항목 보기를 숨기려면 이 작업을 수행합니다.

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이므로, 차단하지 않으면 의도하지 않은 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);
    }

    ....
}

"GONE"은 항목이 차지하는 공간을 제거하지 않습니다...사용할 수 있습니다.

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

bindview의 "내부홀더"

RV는 루트 뷰 정보를 내부적으로 캐시하는 것처럼 보이기 때문에 가시성을 변경하는 것은 항목에 의해 차지된 공간에 아무런 영향을 참조하십시오.

프레임 레이아웃으로 RV 항목 보기를 래핑하고 View.GONE을 내부 보기로 설정합니다.이렇게 하면 점유된 공간이 올바르게 삭제되고 항목이 전혀 표시되지 않습니다.

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

                        }

로레스쿠 조지 츠틀린과 달랍에게 감사드립니다.

holder.itemView.set Visibility(보기)를 설정합니다.VISCOBLE); 지금 작동하지 않습니다.나는 이것을 사용합니다.

holder.itemView.findViewById(R.id .card)를 검색합니다.set Visibility(보기)를 설정합니다.GONE);

View를 쉽게 전송할 수 있습니다.작업 함수의 홀더 값...

View의 높이와 너비를 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는 재활용 보기의 항목을 숨기거나 표시하는 부울입니다.

OnBindView의 코드 아래 줄 사용요건에 따른 홀더 블록,

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

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

언급URL : https://stackoverflow.com/questions/41223413/how-to-hide-an-item-from-recycler-view-on-a-particular-condition