RecyclerView 关于Item选中取消选中的完美实现

很多时候要用到RecycelerView做数据的显示处理,点击选中及再次点击取消选中的操作,也看了一些其他博主写的相关博客,但总感觉8太行,要么过于冗余,要么描述不清,这需求比较简单,所以逻辑也应简洁明了。正好这些天工作上有相关的需求,所以记录一下我的实现过程。

老规矩先看效果:

Item点击选中、取消选中效果

上操作:

(1)先新建一个TestAdapter.java,ViewHolder就定义了一个简单的TextView。然后就是 onCreateViewHolder()和onBindViewHolder()这两个方法的重写,前者用于实例化ViewHolder,后者用于Item状态的复用,不太建议在onBindViewHolder()中去写过于复杂的逻辑。如果还有朋友不太会写adpter适配器的可以先去学习一下,我这里就不详细介绍了。

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {}@Overridepublic int getItemCount() {  return 0;}static class ViewHolder extends RecyclerView.ViewHolder{private TextView textView;public ViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.text_view);}}
}

(2)选中和取消选中显示不同的效果,主要就是在RecyclerView复用过程中当前position和所点击项是否为同一项,以及多次点击后的状态决定了复用时所显示的效果;
根据该逻辑在TestAdapter中新建两个变量:currentPosition 当前项、isClick是否点击。

    private boolean isClick;private int currentPosition;private boolean firstLoad = true; //是否初次加载,用于默认选中第一条数据 public int getCurrentPosition() {return currentPosition;}public boolean isClick() {return isClick;}public void setCurrentPosition(int currentPosition , boolean isClick) {this.currentPosition = currentPosition;this.isClick = isClick;}

(3)重写onCreateViewHolder()方法,设置Item点击事件

  @Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_layout , parent ,false);ViewHolder holder = new ViewHolder(view);ItemClickEvent(holder);return holder;}private void ItemClickEvent(ViewHolder holder) {holder.itemView.setOnClickListener(view -> {if (!isClick){setCurrentPosition(holder.getBindingAdapterPosition(), true);}else {setCurrentPosition(holder.getBindingAdapterPosition(), getCurrentPosition() != holder.getBindingAdapterPosition());}notifyDataSetChanged();});}

ItemClickEvent()主要是用于记录点击状态,isClick默认为false未点击,通过setCurrentPosition()方法记录当前点击项holder.getBindingAdapterPosition(),同时设置点击状态为true【这里说明一下,我用的是androidx的库,和旧版support有稍稍不同】。

当某项的点击状态为true时,进入else:setCurrentPosition()方法同样记录当前点击项,不同的是此时点击状态根据getCurrentPosition()所获取的当前项和holder.getBindingAdapterPosition()最新的点击项进行比较设置,如果两者不相等为true则说明点击选中了新的一项,否则为false说明是在原来项进行点击取消操作。然后调用notifyDataSetChanged()方法更新。

(4)重写onBindViewHolder()方法,初始化 or 复用数据的状态

 @Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {String text = list.get(position);holder.textView.setText(text);//初次加载默认选中第一项if(firstLoad){setCurrentPosition(0, true);firstLoad = false;}if (getCurrentPosition() == position && isClick()){holder.textView.setBackgroundResource(R.color.white);holder.textView.setTextSize(20);}else {holder.textView.setBackgroundResource(R.color.green);holder.textView.setTextSize(15);}

在代码复用过程中,通过CurrentPositionisClick两个变量来控制显示的状态,如果position等于getCurrentPosition()当前点击项 且点击状态为true时显示白色背景,设置大号字体,否则就显示绿色背景,设置小号字体。

总结:通过当前点击项和记录项做判断,同时根据点击状态即可实现选中、取消选中的效果

最后附上TestAdapter.java完整代码:

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {private Context context;private List<String> list;private boolean isClick;private int currentPosition;public int getCurrentPosition() {return currentPosition;}public boolean isClick() {return isClick;}public void setCurrentPosition(int currentPosition , boolean isClick) {this.currentPosition = currentPosition;this.isClick = isClick;}public TestAdapter(Context context , List<String> list){this.context = context;this.list = list;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_layout , parent ,false);ViewHolder holder = new ViewHolder(view);ItemClickEvent(holder);return holder;}private void ItemClickEvent(ViewHolder holder) {holder.itemView.setOnClickListener(view -> {if (!isClick){setCurrentPosition(holder.getBindingAdapterPosition(), true);}else {setCurrentPosition(holder.getBindingAdapterPosition(), getCurrentPosition() != holder.getBindingAdapterPosition());}notifyDataSetChanged();});}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {String text = list.get(position);holder.textView.setText(text);if (getCurrentPosition() == position && isClick()){holder.textView.setBackgroundResource(R.color.white);holder.textView.setTextSize(20);}else {holder.textView.setBackgroundResource(R.color.pink);holder.textView.setTextSize(15);}}@Overridepublic int getItemCount() {return list.size();}static class ViewHolder extends RecyclerView.ViewHolder{private TextView textView;public ViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.text_view);}}
}

OK 打完收工~~


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部