Android RecyclerView onClickListener设置性能

Android RecyclerView onClickListener设置性能,android,android-recyclerview,onclick,onclicklistener,Android,Android Recyclerview,Onclick,Onclicklistener,所以我第一次尝试为我的RecyclerView实现onClickListener,我一直在想我所做的是否真的值得去做。在我的应用程序中,我有不同的回收器视图,并且在大多数应用程序中,我不需要同时使用onClickListeners和onlongclickinlisteners,所以我想这样做,这样我就不必在中同时实现它们。我基本上检查哪个onClickListener是使用枚举模式设置的,然后根据这一点,我在onCreateViewHolder中设置我的侦听器。这样做有意义吗?或者我应该只实现两

所以我第一次尝试为我的RecyclerView实现
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;
            }
        }
    }
}