【发布时间】:2023-04-05 20:39:01
【问题描述】:
所以我第一次尝试为我的 RecyclerView 实现onClickListener,我一直想知道我所做的是否真的值得做。在我的应用程序中,我有不同的 Recycler Views,而且我不需要在大多数情况下同时使用 onClickListeners 和 onLongClickListeners,所以我想这样做,这样我就不必同时实现它们我的.setOnItemClickListener。我基本上检查了哪个onClickListener 设置了枚举模式,然后据此我将我的听众设置为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();
}
});
【问题讨论】:
标签: android android-recyclerview onclick onclicklistener