6

Я использую Firebase Recycler Adapter (Firebase UI Library) для заполнения Recycler View. Я хочу скрыть элемент (строку) при условии. У меня есть LinearLayout, содержащее вид ресайклера.Как скрыть элемент от просмотра Recycler по конкретному состоянию?

Я установил видимость линейного макета, чтобы уйти в 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()); 
} 

Он скрывает LinearLayout, но строка остается там с пустым пространством.

Есть ли какой-либо метод, который я должен переопределить для преодоления этого или есть ли способ достижения результата?

+4

Было бы лучше, чтобы заполнить данные без не нужных элементов – Selvin

+0

вне темы комментариев: также ваш 'if' уже не' else' ... это будет вам удар в задница позже (повторено с повторным использованием) – Selvin

+0

Я согласен с Селвином, но, возможно, высота = 0 сделает трюк – aclokay

ответ

11

Вы должны скрыть все представления или родительский элемент из макета UserViewholder xml.

view.setVisibility(View.GONE); 

Но не забудьте установить их VISIBLE в противном случае, вы будете в конечном итоге с некоторыми странными вещами из вторсырья

+0

Это выглядит многообещающим. Я обязательно попробую это. – Dhaval

+0

Вы можете добавить метод в ViewHolder, например show()/hide(), который обрабатывает всю работу видимости. Не забывайте, что это вид ресайклера, поэтому вам нужно показать держатель для просмотра, если условие не выполнено, иначе скрываются нежелательные элементы. –

+0

Спасибо. Ваш ответ сработал для меня! – Dhaval

2

Там нет встроенного в способ скрыть ребенка в 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); 
    } 

    .... 
} 
+0

Но я не реализовал пользовательский адаптер RecyclerView. Как я уже упоминал, я использую FirebaseRecyclerAdapter. – Dhaval

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

         } 

Спасибо lorescu Джордж Cătălin и Dhalav

11

IF

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. 

    } 
    } 

Теперь Звонить с FirebaseAdapter

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

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

Это лучшее решение, чем 'view.setVisibility (View.GONE);'. Потому что вам не нужно очищать поля и украшения «ViewHolder». – MeLine

+0

Все зависит от вашего вида. Если у вас есть «LinearLayout» и используйте «GONE», вы увидите, что оно будет отменено. –

+0

Я использовал 'itemView.setLayoutParams (...)', и он отлично работал для меня. благодаря! – chornge

8

В некоторых случаях изменения только атрибут видимости еще может закончиться как выделено пустое место (из-за заполнения родительского вида по краям, внутренние элементы и т.д.). Тогда изменение высоты родительского вида помогает:

view.setVisibility(View.GONE); 
view.setLayoutParams(new RecyclerView.LayoutParams(0, 0)); 
+1

спасибо за решение работает как шарм. –

+0

Его работа хорошая –

+0

Хотя он отлично работает для линейного recyclerview, но не удаляет свободное место в grid recyclerview – anonymous