Проблемы в RecyclerView Android L

Я играл с RecyclerView немного. Есть ли простой способ поставить OnClickListener для предметов в RecyclerView? Я пытался реализовать это в ViewHolder, Событие onClick никогда не срабатывало.

И я использовал notifyItemInserted(position) для добавления нового значения в RecyclerView, Пользовательский интерфейс не обновляется автоматически. Нужно тянуть вверх и вниз, чтобы обновить. Но когда я призываю notifyDatasetChanged(..), все в порядке.

Я применил DefaultItemAnimator в RecyclerView, Но, не видя никакой анимации, когда добавлен новый элемент.

Заранее спасибо за любую идею.

Это первый компонент Android L, который я протестировал, и я застрял там.

Вот мой класс Адаптер:

public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder> {

private List<String> arrExperiences;

//Provide a reference to the type of views that you are using - Custom ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {

    public TextView tvExperienceTitle;
    public TextView tvExperienceDesc;

    public MyViewHolder(RelativeLayout itemView) {
        super(itemView);
        tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title);
        tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc);
    }

}

//Provide a suitable constructor : depending on the kind of dataset.
public AdapterRecyclerView(List<String> arrExperiences){
    this.arrExperiences = arrExperiences;
}

//Create new view : invoke by a Layout Manager
@Override
public AdapterRecyclerView.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_recycler, parent, false);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
    //get element from your dataset at this position.
    //replace the content of the view with this element.
    viewHolder.tvExperienceTitle.setText(arrExperiences.get(position));
}

@Override
public int getItemCount() {
    return arrExperiences.size();
}

public void addExperience(String experience, int position){
    arrExperiences.add(position, experience);
    notifyItemInserted(position);
    //notifyDataSetChanged();
}

public void removeExperience(){
    int index = (int) (Math.random() * arrExperiences.size());
    arrExperiences.remove(index);
    notifyItemRemoved(index);
    //notifyDataSetChanged();
}
}

4 ответа

Просто добавьте это в свой адаптер:

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
    yourItems.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
          //do your stuff
       }
   });
}

Пожалуйста, посмотрите мой ответ здесь. Вам нужен дополнительный класс (который может быть включен как часть полной версии), но он позволит вам создавать OnItemClickListeners так, как вы привыкли для ListViews.

Здесь вы получаете простой класс Adapter, который может выполнять onItemClick событие в каждой строке списка для recyclerview,

Поскольку вы до сих пор не пометили правильный ответ, и даже если это старый вопрос, я постараюсь предоставить способ, которым я делаю. Я думаю, что это очень чисто и профессионально. Функциональные возможности взяты из разных блогов (я все еще должен упомянуть их на странице), объединены, и методы были улучшены для скорости и масштабируемости, для всех действий, которые используют RecycleView.

https://github.com/davideas/FlexibleAdapter

  • В более низком классе есть SelectableAdapter, который предоставляет функции выбора, и он может поддерживать состояние после поворота, вам просто нужно вызвать методы onSave/onRestore из действия.
  • Затем класс FlexibleAdapter обрабатывает контент с поддержкой анимации (вызывая уведомление только для позиции. Примечание: вам все еще нужно установить анимацию в RecyclerView, когда вы создаете это действие).
  • Тогда вам нужно снова расширить этот класс. Здесь вы добавляете и реализуете методы по своему усмотрению для своего собственного ViewHolder и своего класса Domain/Model (держатель данных). Примечание. Я привел пример, который не компилируется, потому что вам нужно изменить классы на те, которые есть в вашем проекте.

Я думаю, что именно ViewHolder должен удерживать слушателей щелчков и что это должно быть сделано при создании, а не в методе Binding (который вызывается при каждом недействительном из notify...()).

Также обратите внимание, что этот адаптер обрабатывает основные щелчки: одиночные и длинные щелчки, если вам нужно двойное нажатие, вам нужно использовать то, что делает Jabob Tabak в своем ответе.

Я все еще должен улучшить это, так что следите за этим. Я также хочу добавить некоторые новые функции, такие как Undo.

Другие вопросы по тегам