Android RecyclerView onClickListener设置性能
所以我第一次尝试为我的RecyclerView实现Android RecyclerView onClickListener设置性能,android,android-recyclerview,onclick,onclicklistener,Android,Android Recyclerview,Onclick,Onclicklistener,所以我第一次尝试为我的RecyclerView实现onClickListener,我一直在想我所做的是否真的值得去做。在我的应用程序中,我有不同的回收器视图,并且在大多数应用程序中,我不需要同时使用onClickListeners和onlongclickinlisteners,所以我想这样做,这样我就不必在中同时实现它们。我基本上检查哪个onClickListener是使用枚举模式设置的,然后根据这一点,我在onCreateViewHolder中设置我的侦听器。这样做有意义吗?或者我应该只实现两
onClickListener
,我一直在想我所做的是否真的值得去做。在我的应用程序中,我有不同的回收器视图,并且在大多数应用程序中,我不需要同时使用onClickListeners
和onlongclickinlisteners
,所以我想这样做,这样我就不必在中同时实现它们。我基本上检查哪个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);
}
}
}
没关系,但可以更好
1)您正在为每个位置创建单击侦听器和长单击侦听器
您不需要像这里这样为每个职位创建一个监听器:
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() ...
and
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() ...
由于它们执行的操作非常相似,因此您只能创建一个单击和长单击侦听器,并与所有视图共享。为此,将itemView.setOnClickListener()和itemView.setOnLongClickListener()移动到ViewHolder
类
您还需要在ViewHolder中保存该位置。因此,他们将能够存储自己的位置
2)您不需要创建枚举
您不需要创建枚举来检查当前模式(单击或长单击)是否正确。例如,您可以只检查变量是否为null
最后,您可以得到如下代码:
public class FreindRecyclerViewAdapter extends RecyclerView.Adapter<FreindRecyclerViewAdapter.MyViewHolder> {
private ClickListener clickListener ;
private LongClickListener longClickListener;
private Context context;
private List<String> friends;
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;
}
public void setOnLongItemClickListener(LongClickListener longItemClickListener) {
this.longClickListener = longItemClickListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view;
view = LayoutInflater.from(context).inflate(R.layout.friend_item, viewGroup, false);
return new MyViewHolder(view, i, clickListener, longClickListener);;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {
myViewHolder.friendName.setText(friends.get(position));
}
@Override
public int getItemCount() {
return friends.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements
View.OnLongClickListener, View.OnClickListener {
private TextView friendName;
private int position;
public MyViewHolder(View itemView, int position) {
super(itemView);
friendName = itemView.findViewById(R.id.friendName_ID);
this.position = position;
if (clickListener != null) {
itemView.setOnClickListener(this);
}
if (longClickListener != null) {
itemView.setOnLongClickListener(this);
}
}
@Override
public void onClick(View view) {
if (clickListener != null) {
clickListener.onItemClick(position, view);
}
}
@Override
public boolean onLongClick(View view) {
if (longClickListener != null) {
longClickListener.onItemLongClick(position, view);
return true;
} else {
return false;
}
}
}
}
公共类FreindRecycleServiceAdapter扩展了RecyclerView.Adapter{
私有ClickListener ClickListener;
私人LongClickListener LongClickListener;
私人语境;
私人名单朋友;
公共界面ClickListener{
虚线单击(内部位置,视图v);
}
公共界面LongClickListener{
长点击无效(内部位置,视图v);
}
public void setOnItemClickListener(ClickListener ClickListener){
this.clickListener=clickListener;
}
公共无效设置longItemClickListener(LongClickListener longItemClickListener){
this.longClickListener=longItemClickListener;
}
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
视图;
视图=LayoutFlater.from(上下文)。充气(R.layout.friend\u项,视图组,false);
返回新的MyViewHolder(视图、i、clickListener、longClickListener);;
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder MyViewHolder,int位置){
myViewHolder.friendName.setText(friends.get(position));
}
@凌驾
public int getItemCount(){
return friends.size();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder实现
View.OnLongClickListener,View.OnClickListener{
私有文本视图名称;
私人职位;
公共MyViewHolder(视图项视图,int位置){
超级(项目视图);
friendName=itemView.findViewById(R.id.friendName\u id);
这个位置=位置;
如果(clickListener!=null){
setOnClickListener(这个);
}
如果(longClickListener!=null){
setOnLongClickListener(此);
}
}
@凌驾
公共void onClick(视图){
如果(clickListener!=null){
单击Listener.onItemClick(位置、视图);
}
}
@凌驾
仅长按公共布尔值(视图){
如果(longClickListener!=null){
longClickListener.onItemLongClick(位置、视图);
返回true;
}否则{
返回false;
}
}
}
}
- 请注意,现在,每个视图持有者都知道自己的位置
- 视图持有者实现常规的
视图。OnClickListener
和视图。LongClickListener
。因此,您不需要为每个位置实例化一个新的侦听器
- 如果要启用单击,请调用
freindrecycleServiceAdapter.setOnItemClickListener(对象)代码>
- 如果要启用长时间单击,请调用
freindrecycleServiceAdapter.setOnLongItemClickListener(对象)代码>
- 如果要禁用其中任何一个,请不要调用上面的方法,或者只调用它们作为参数传递
null
。如果在MyViewHolder
中检查代码,可以看到当这些侦听器为空时执行的任何操作
希望我能帮助和分享更多的方法来实现你想要的 根据谷歌文档onCreateViewHolder
中的i
变量return new MyViewHolder(view,i)
实际上不是位置,而onCreateViewHolder
中的i
是视图类型,只有onBindViewHolder
中的i
是位置,我在代码中重命名了它。我对没有创建很多onClickListener感到有点困惑,您说过对ViewHolder
实现onClickListener
可以避免创建多个侦听器,但是这一行不是返回new MyViewHolder(view,i)
为每个视图创建新的ViewHolder,它基本上创建了新的onClickListener吗(本身)与它?
public class FreindRecyclerViewAdapter extends RecyclerView.Adapter<FreindRecyclerViewAdapter.MyViewHolder> {
private ClickListener clickListener ;
private LongClickListener longClickListener;
private Context context;
private List<String> friends;
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;
}
public void setOnLongItemClickListener(LongClickListener longItemClickListener) {
this.longClickListener = longItemClickListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view;
view = LayoutInflater.from(context).inflate(R.layout.friend_item, viewGroup, false);
return new MyViewHolder(view, i, clickListener, longClickListener);;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {
myViewHolder.friendName.setText(friends.get(position));
}
@Override
public int getItemCount() {
return friends.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements
View.OnLongClickListener, View.OnClickListener {
private TextView friendName;
private int position;
public MyViewHolder(View itemView, int position) {
super(itemView);
friendName = itemView.findViewById(R.id.friendName_ID);
this.position = position;
if (clickListener != null) {
itemView.setOnClickListener(this);
}
if (longClickListener != null) {
itemView.setOnLongClickListener(this);
}
}
@Override
public void onClick(View view) {
if (clickListener != null) {
clickListener.onItemClick(position, view);
}
}
@Override
public boolean onLongClick(View view) {
if (longClickListener != null) {
longClickListener.onItemLongClick(position, view);
return true;
} else {
return false;
}
}
}
}