Страницы

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

вторник, 5 марта 2019 г.

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

у меня один адаптер и два активити. И хочу чтоб в каждом из этих активити отображались разные переходы по клику на 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.


Ответ

В данном случае проще и архитектурно правильно прокинуть интерфейс из адаптера и регистрировать его в вызывающей активити, чем вешать действия слушателей прямо в адаптере. Данный подход позволит реализовать любую уникальную логику по клику в каждой вызывающей активити, без всяких костылей и нагромождения вариантов переходов в кликере адаптера. Примерный код (исключены все методы не относящиеся к реализации):
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, по которому кликнули, позицию в адаптере и признак валидности этой позиции. Вы можете передавать из адаптера и другие произвольные данные, которые вам могут требоваться.

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

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