Проблемы в 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();
}
}

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

https://github.com/davideas/FlexibleAdapter

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

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

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

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