Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Как выбирать действия в адаптере в зависимости от активити

#android #activity #recyclerview #adapter #cardview


у меня один адаптер и два активити. И хочу чтоб в каждом из этих активити отображались
разные переходы по клику на item.

 itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, EventActivity.class);
                intent.putExtra("event_id", item.event.getId());
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                    context.startActivity(intent);
                    ((Activity)context).overridePendingTransition(R.anim.slide_in_from_right,
R.anim.push_to_back);
                } else {

                    Pair p1 = Pair.create((View) itemHolder.mTitleView,
"event_title");
                    Pair p2 = Pair.create((View) itemHolder.mInterestViewColor,
"event_interest_bg");
                    Pair p3 = Pair.create((View) itemHolder.mImageView,
"ivent_image");
                    Pair p4 = Pair.create((View) itemHolder.mInterestTitle,
"event_interest_name");
                    ActivityOptionsCompat options = ActivityOptionsCompat.
                            makeSceneTransitionAnimation((Activity) context, p1,
p2, p3, p4);
                    context.startActivity(intent, options.toBundle());
                }
            }
        });


Как сделать выбор, если он находится в активити1, то по нажатию на item, переходит
на одну страницу, если находится в активти2, то по нажатию на этот Же item, но в другую
страницу.

Item это отдельный layout, для recyclerview. 
    


Ответы

Ответ 1



В данном случае проще и архитектурно правильно прокинуть интерфейс из адаптера и регистрировать его в вызывающей активити, чем вешать действия слушателей прямо в адаптере. Данный подход позволит реализовать любую уникальную логику по клику в каждой вызывающей активити, без всяких костылей и нагромождения вариантов переходов в кликере адаптера. Примерный код (исключены все методы не относящиеся к реализации): class SomeAdapter extends RecyclerView.Adapter { interface OnCardClickListener { void onCardClick(View view, int position, boolean isValid); } private static OnCardClickListener mListener; public void setOnCardClickListener(OnCardClickListener listener) { mListener = listener; } public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ CardView mCard; public ItemHolder(View v) { super(v); mCard = (CardView) v.findViewById(R.id.bell_card); mCard.setOnClickListener(this); } @Override public void onClick(View v) { int position = getAdapterPosition(); boolean isValid = (position != RecyclerView.NO_POSITION); mListener.onCardClick(v, position, isValid); } } } Далее в активити используем так: public class SomeActivity extends Activity implements SomeAdapter.OnCardClickListener { RecyclerView mList; SomeAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mList = (RecyclerView) findViewById(R.id.list); mList.setLayoutManager(new LinearLayoutManager(this)); mAdapter = new SomeAdapter(mData); mAdapter.setOnCardClickListener(this); mList.setAdapter(mAdapter); } @Override public void onCardClick(View view,final int position, boolean isValid) { if (isValid) { switch (view.getId()) { case R.id.button1: return true; default: return false; } } } } В каждой активити может быть своя реализация действий в переопределенном методе onCardClick(). Колбэк передает в активити View, по которому кликнули, позицию в адаптере и признак валидности этой позиции. Вы можете передавать из адаптера и другие произвольные данные, которые вам могут требоваться.

Комментариев нет:

Отправить комментарий