, поэтому я впервые попытался реализовать onClickListener
для моего RecyclerView, и мне было интересно, стоит ли делать то, что я делал. В моем приложении у меня есть разные виды Recycler, и мне не нужно одновременно использовать onClickListeners
и onLongClickListeners
в большинстве из них, поэтому я хотел сделать это так, чтобы мне не пришлось реализовывать их оба в мой .setOnItemClickListener
. Я в основном проверяю, какой onClickListener
настроен в режиме enum, а затем в соответствии с этим я устанавливаю своих слушателей в onCreateViewHolder
. Есть ли смысл делать это? Или мне просто реализовать обоих слушателей и не делать то, что я делал в своем коде?
public class FreindRecyclerViewAdapter extends RecyclerView.Adapter<FreindRecyclerViewAdapter.MyViewHolder> {
private ClickListener clickListener ;
private LongClickListener longClickListener;
private Context context;
private List<String> friends;
private ListenerMode mode;
public enum ListenerMode {NullMode, ShortClick, LongClick}
public interface ClickListener {
void onItemClick(int position, View v);
}
public interface LongClickListener {
void onItemLongClick(int position, View v);
}
public void setOnItemClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
mode = ListenerMode.ShortClick;
}
public void setOnLongItemClickListener(LongClickListener longItemClickListener) {
this.longClickListener = longItemClickListener;
mode = ListenerMode.LongClick;
}
public FreindRecyclerViewAdapter (Context context, List<String> friends) {
this.context = context;
this.friends = friends;
this.mode = ListenerMode.NullMode;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view;
view = LayoutInflater.from(context).inflate(R.layout.friend_item, viewGroup, false);
final MyViewHolder myViewHolder = new MyViewHolder(view);
if(mode == ListenerMode.ShortClick) {
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clickListener.onItemClick(myViewHolder.getAdapterPosition(), view);
}
});
} else if (mode == ListenerMode.LongClick) {
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
longClickListener.onItemLongClick(myViewHolder.getAdapterPosition(), view);
return true;
}
});
}
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {
myViewHolder.friendName.setText(friends.get(position));
}
@Override
public int getItemCount() {
return friends.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
private TextView friendName;
public MyViewHolder(View itemView) {
super(itemView);
friendName= itemView.findViewById(R.id.friendName_ID);
}
}
}
РЕДАКТИРОВАТЬ : Теперь, когда я думаю об этом, я даже не знаю, почему это работает, например, когда я настраиваю свой RecyclerView, адаптер и все в своем коде ниже, я сначала говорю адаптеру о списке, который я хочу показать на экране в его конструкторе recyclerViewAdapter = new FreindRecyclerViewAdapter(this, friends);
, так что это когда onCreateViewHolder
вызывается для моих представлений. Поэтому теперь, когда все создано (ViewHolders), я вызываю функцию для настройки OnClickListener, который в моем коде добавляет разных слушателей в соответствии с установленным mode
, и эти слушатели добавляются в onCreateViewHolder
, который уже был вызвал, так почему RecyclerViewAdapter (и как он узнает) снова вызывает onCreateViewHolder
, чтобы добавить слушателей?
friends = new ArrayList<>();
friends.add("Josh");
friends.add("Mike");
friends.add("Ashley");
friends.add("Jess");
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView = findViewById(R.id.recyclerViewFriend_ID);
recyclerViewAdapter = new FreindRecyclerViewAdapter(this, friends);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(recyclerViewAdapter);
DividerItemDecoration itemDecor = new DividerItemDecoration(this, linearLayoutManager.getOrientation());
recyclerView.addItemDecoration(itemDecor);
recyclerViewAdapter.setOnLongItemClickListener(new FreindRecyclerViewAdapter.LongClickListener() {
@Override
public void onItemLongClick(int position, View v) {
Toast.makeText(FriendActivity.this, "Long Click. Position:" + Integer.toString(position), Toast.LENGTH_SHORT).show();
}
});