2015-06-30 1 views
1

Могу ли я установить setOnclickListener или или setOnLongClickListener в onBindViewHolder?Android: правильный набор setOnclickListener или или setOnLongClickListener в onBindViewHolder?

Нет проблем с этим методом onBindViewHolder написать? (Умнодительно или нет?)

Или лучше в ViewHolder написать?

public void onBindViewHolder(ViewHolder holder, int position) { 


    myBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //... 
     } 
    }); } 

Этот метод плохо влияет на скорость списка RecyclerView?

+1

Я не думаю, что есть где-нибудь еще, что вы могли бы его поместить ... – tachyonflux

+0

@karaokyo не проблема в 'onBindViewHolder'? – grizzly

+1

Не должно быть проблем. Это просто создание и установка слушателя. Для создания и установки строки было бы слишком сложно. – tachyonflux

ответ

0

ViewHolders - это в основном кеши объектов View и внутреннего класса RecyclerView.

С RecyclerView.Adapter абстрактен вам придется выполнять эти три метода:

общественность VH onCreateViewHolder (ViewGroup родитель, внутр viewType) общественности недействительного onBindViewHolder (держатель В.Х., внутр положение) общественного ИНТ getItemCount()

вы можете использовать RecyclerView.OnItemTouchListener в сочетании с обнаружением жестов для идентификации этих событий.

Вы можете добавить слушателей в реализацию пользовательского адаптера. Это будет что-то вроде:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

public interface OnItemClickListener { 
    public void onItemClicked(int position); 
} 

public interface OnItemLongClickListener { 
    public boolean onItemLongClicked(int position); 
} 

private Fragment mFragment; 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    public View v; 

    public ViewHolder(View v) { 
     super(v); 
     this.v = v; 
    } 
} 

public RecyclerViewAdapter(Fragment fragment) { 
    mFragment = fragment; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
    holder.v.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mFragment.onItemClicked(position); 
     } 
    }); 
    holder.v.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      mFragment.onItemLongClicked(position); 
      return true; 
     } 
    }); 
} 
. . . 

}

+2

Это неправильно, вы не можете использовать позицию в обратном вызове, потому что она может измениться и в отличие от ListView, вы не получите другой обратный вызов. Подробнее см. В документации. – yigit

+1

Усиление комментария yigit, вы не должны делать позицию окончательной, вот объяснение: youtube.com/watch?v=imsr8NrIAMs&t=34m53s – Gustavo

5

Добавьте его на onCreateViewHolder метод так, что вы не в большом количестве объектов слушателя. Вы должны использовать vh.getAdapterPosition, чтобы отобразить его обратно к вашим данным.

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

  • Нет связанных вопросов^_^