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