2015-05-27 4 views
1

У меня есть recyclerview, в котором onLongClick() элемента, я показываю кнопку. Но when scroll down the recycler view and scrolling back, that button is showing on top of another item or sometimes it is not showing вообще. Вот мой кодAndroid RecyclerView не сохраняет свое состояние при прокрутке назад

public static class TextViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{ 
    public LinearLayout enq_layout; 
    public LinearLayout item_layout; 
    public TextView enquire; 
    public int position; 

    public TextViewHolder(View itemView) { 
     super(itemView); 
     item_layout= (LinearLayout) itemView.findViewById(R.id.item_layout); 
     enq_layout= (LinearLayout) itemView.findViewById(R.id.enq_layout); 
     enquire=(TextView) itemView.findViewById(R.id.enquire); 
     //position=getLayoutPosition(); 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    return product.get(position)!=null? VIEW_ITEM: VIEW_PROG; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.cardlayout_product, parent, false); 
     RecyclerView.ViewHolder vh = new TextViewHolder(v); 
    return vh; 
} 
@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // Toast.makeText(act, "onBindViewHolder" +position, Toast.LENGTH_LONG).show(); 
     final ProductDetails item = product.get(position); 
     final TextViewHolder hold=((TextViewHolder)holder); 

     //hold.position=position; 
     // hold.item_layout.setTag(position); 

     hold.item_layout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
      // go to next activity 
      } 
     }); 
     hold.item_layout.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       // show enquiry button 
       hold.enq_layout.setVisibility(View.VISIBLE); 
      } 
     }); 
     hold.enquire.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //do some operation 
       int productid = Integer.parseInt(product.get(item.getPosition()).getProduct_id()); 
      } 
     }); 
} 
@Override 
public int getItemCount() { 
    return product.size(); 
} 

Я попробовал этот способ Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview?, но я не в состоянии получить доступ мнения внутри OnClick методов onCreateViewHolder в.

+1

Имейте, чтобы хранить в позиции с длинным щелчком и пытаться показать кнопку hide/show button base на сохраненной позиции на onBindViewHolder(). –

+1

Спасибо. Теперь он работает. – n1m1

+0

Рад помочь вам, и вы сделали хорошую работу ..., попробуйте загрузить свои изменения, чтобы другие могли также получить от нее идеи. –

ответ

0

Вы собираетесь должны создать глобальную переменную, например, логическое shouldShowView так:

public static class TextViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{ 
    public LinearLayout enq_layout; 
private boolean shouldShowView; 

Затем в onBindViewHolder использования можно использовать следующий код:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // Toast.makeText(act, "onBindViewHolder" +position, Toast.LENGTH_LONG).show(); 
     final ProductDetails item = product.get(position); 
     final TextViewHolder hold=((TextViewHolder)holder); 

if (shouldShowView) { 
    hold.enq_layout.setVisibility(View.VISIBLE); 
    } else { 
    hold.enq_layout.setVisibility(View.INVISIBLE); 
    } 

Затем в onLongClick метод просто установите для переменной shouldShowView значение true, если был длинный щелчок. Вы также должны установить значение false в другом месте, если хотите скрыть кнопку. Вам также может потребоваться отслеживать, какой элемент был выбран в глобальном состоянии переменной, и проверить, соответствует ли текущая позиция выбранной позиции.

Возможно, вы также захотите переместить проверку shouldShowView под слушателями кликов.

Дайте мне знать, если возникнут какие-либо вопросы.

+0

Будет хорошо, если вы можете выбрать его как правильный ответ :-) – Smashing

0

вы можете попробовать это

 public View getViewByPosition(int position, ListView lv1) { 
     final int firstListItemPosition = lv1.getFirstVisiblePosition(); 
     final int lastListItemPosition = firstListItemPosition +  
     lv1.getChildCount() - 1; 
     if (position < firstListItemPosition || position > 
     lastListItemPosition) { 
      return lv1.getAdapter().getView(position, null, lv1); 
     } else { 
      final int childIndex = position - firstListItemPosition; 
      return lv1.getChildAt(childIndex); 
     } 
    } 

И в вашем объявим его как этот

   selectedids =""; 
       for (int i = 0; i < len; i++){ 

        //View childv = lv1.getChildAt(i); 
        View childv=getViewByPosition(i, lv1); 
0

У меня была такая же проблема, и решить это. Вам необходимо использовать метод RecyclerView и установить размер кеша элементов: mRecyclerView.setItemViewCacheSize(300);

Смежные вопросы