Как реализовать OnClickListener в RecyclerView?

1

Я хочу сделать меню выбора для профилей, используя RecyclerView. Я создал это с RecyclerView. Теперь я получаю проблему в onItemClickListener. Я хочу изменить фон CardView и Text Color при выборе элемента. одновременно может быть выбран только один элемент. И при следующем нажатии кнопки он должен перенаправить на активность в соответствии с выбором.

Это мой экран выглядит так:

Изображение 174551

public class SelectProfile extends AppCompatActivity {

private String[] mTextData;
private int[] mImgData;
RecyclerView recyclerView;
private ProfileAdapter profileAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select_profile);

    recyclerView = findViewById(R.id.recycleProfile);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,2);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);

    profileAdapter = new ProfileAdapter();
    recyclerView.setAdapter(profileAdapter);

    int imgData[] = {R.drawable.ic_college_icon,R.drawable.ic_parent,R.drawable.ic_student,R.drawable.ic_teaching,
                    R.drawable.ic_non_teaching,R.drawable.ic_other};
    final String textData[] = {"School/College","Parent","Student","Teaching Staff","Non-Teaching Staff","Other"};

    profileAdapter.setData(imgData,textData);

}

private class ProfileAdapter extends RecyclerView.Adapter<ProfileAdapter.ProfileAdapterViewHolder>{

    int index = -1;

    @NonNull
    @Override
    public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        int layoutIdForListItem = R.layout.profile_item;
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        boolean shouldAttachToParent = false;

        View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
        return new ProfileAdapterViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ProfileAdapterViewHolder holder,final int position) {
        int mImage = mImgData[position];
        String mText = mTextData[position];

        holder.img.setImageResource(mImage);
        holder.txt.setText(mText);

         holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                index = position;
                notifyDataSetChanged();
            }
        });

        if (index == position){
            holder.card.setBackground(getResources().getDrawable(R.drawable.bg_select_profile));
                holder.txt.setTextColor(getResources().getColor(R.color.colorPrimary));
        }else {
            holder.card.setCardBackgroundColor(getResources().getColor(android.R.color.white));
            holder.txt.setTextColor(getResources().getColor(R.color.gray));
        }
    }


    @Override
    public int getItemCount() {
        if (null == mImgData) return 0;
        return mImgData.length;
    }

    public class ProfileAdapterViewHolder extends RecyclerView.ViewHolder  {
        private final AppCompatImageView img;
        private final TextView txt;
        private final CardView card;
        private ProfileAdapterViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img);
            txt = itemView.findViewById(R.id.txt);
            card = itemView.findViewById(R.id.card);
        }



    }

    private void setData(int[] imgData,String[] txtData){
        mImgData = imgData;
        mTextData = txtData;
        notifyDataSetChanged();
    }

}
}
Теги:
recycler-adapter
android-recyclerview

5 ответов

1
Лучший ответ

Ваш подход использования переменной Index является правильным, добавьте метод get и метод set для индекса. Но вы не можете установить onClickListener на адаптер. Вместо этого установите слушателя на представление карты следующим образом ->

holder.card.setOnItemClickListener(new ClickListener() {
            @Override
            public void onItemClick(int position, View v) {
                index = position;
                notifyDataSetChanged();
            }
        });

Добавьте этот метод в свой класс адаптера ->

public int getSelectedIndex(){
    return this.index; }

После этого, с вашей деятельности, внутри СЛЕДУЮЩИЙ кнопку onClickListener сделать следующее вещь,

    btnNext.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(profileAdapter.getSelectedIndex() == 1)
//goto activity of your desire and so on
                    }
                });
  • 0
    profileAdapter.getSelectedIndex () == 1 не может разрешить getSelectedIndex
  • 0
    Смотрите мой обновленный ответ. Я обновил это. добавьте указанный метод в ваш класс адаптера.
Показать ещё 1 комментарий
0

Вы можете передать объект слушателя в конструктор, который реализует фрагмент действия ИЛИ

/**
 * item click interface of adapter
 */
public interface ProfileAdapterListener {
    void onItemClick(int position, ProfileAdapterViewHolder holder)
} 

Этот интерфейс реализуется с помощью Fragment OR Activity

/**
 * On item clicked Implement Method from adapter listener.
 *
 * @param position
 */
@Override
public void onItemClick(int position, ProfileAdapterViewHolder holder) {
    // Here you can call that method 
}

Затем вы передаете этот слушатель в конструктор адаптера.

private void buildRecyclerView() {
  profileAdapter = new ProfileAdapter(this);
  recyclerView.setAdapter(profileAdapter);
}

В конструкторе вы можете назначить так

private ProfileAdapterListener mProfileAdapterListener;
 public OfferAdapter(ProfileAdapterListener mProfileAdapterListener) {
        this.mProfileAdapterListener = mProfileAdapterListener
        }
    }

Теперь вы можете использовать этот слушатель, установив прослушиватель щелчка на любом Viwe, как это

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mProfileAdapterListener.onItemClick(position, holder);
            }
        });

Он возвращает вызов метода onItemClick который реализует этот метод. Это безопасный и надежный метод для нажатия на каждый элемент или любой вид в элементе.

0

измените и настройте ваш адаптер, как показано ниже:

private class ProfileAdapter extends RecyclerView.Adapter<ProfileAdapter.ProfileAdapterViewHolder>{

int index = -1;

@NonNull
@Override
public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    int layoutIdForListItem = R.layout.profile_item;
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    boolean shouldAttachToParent = false;

    View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
    return new ProfileAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ProfileAdapterViewHolder holder, int position) {
    int mImage = mImgData[position];
    String mText = mTextData[position];

    holder.img.setImageResource(mImage);
    holder.txt.setText(mText);

    if (index == position){
        holder.card.setCardBackgroundColor(getResources().getColor(R.color.colorPrimary));
        holder.txt.setTextColor(getResources().getColor(R.color.colorPrimary));
    }else {
        holder.card.setCardBackgroundColor(getResources().getColor(android.R.color.white));
        holder.txt.setTextColor(getResources().getColor(R.color.gray));
    }
}


@Override
public int getItemCount() {
    if (null == mImgData) return 0;
    return mImgData.length;
}

public class ProfileAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private final AppCompatImageView img;
    private final TextView txt;
    private final CardView card;
    private ProfileAdapterViewHolder(@NonNull View itemView) {
        super(itemView);
        img = itemView.findViewById(R.id.img);
        txt = itemView.findViewById(R.id.txt);
        card = itemView.findViewById(R.id.card);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        setIndex(getAdapterPosition());

       notifyDataSetChanged();
    }
}

private void setData(int[] imgData,String[] txtData){
    mImgData = imgData;
    mTextData = txtData;
    notifyDataSetChanged();
}

public void setOnItemClickListener(ClickListener clickListener){
    mClickListener = clickListener;
}


private void setIndex(int index){
  this.index=index;
}

}

вам может не понадобиться ClickListener.

  • 0
    Нет, это не работает
  • 0
    Он выбирает, но нажимает на него, а также подсвечивает другие элементы в случайном порядке.
Показать ещё 1 комментарий
0

Используйте представление вашей карты в качестве родительского макета для вашего элемента представления переработчика и примените при прослушивании щелчка к этому представлению карты в адаптере представления переработчика.

holder.your_card_view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

    // get you recyclerview item position here
}

});

  • 0
    Я обновил свой код, но все еще есть проблема
0

Добавьте OnClickListner в корневое представление держателя, лучшее место для записи слушателя находится в onCreateViewHolder, поэтому замените ваш onCreateViewHolder следующим

public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            Context context = parent.getContext();
            int layoutIdForListItem = R.layout.profile_item;
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            boolean shouldAttachToParent = false;

            View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
     ViewHolder viewHolder = new ViewHolder(view);
 view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                postion=viewHolder.getAdapterPosition();
                notifyDataSetChanged();
            }
        });

            return viewHolder ;
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню