RecyclerView 实现点击的另外一种方式

1.前言:之前一直采用流行的方式来给RecyclerView的item设置点击方法,类似这样
  1.    @Override
  2.     public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {
  3.         View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  4.         ViewHolder vh = new ViewHolder(view);
  5.         //将创建的View注册点击事件
  6.         view.setOnClickListener(this);
  7.         return vh;
  8.     }
  9. 现在通过另外一种方式,去实现这个功能,基本逻辑就是利用GestureDector的特性,封装一个公共的类实现点击效果,废话不多少,上代码。

package com.example.android.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    protected OnItemClickListener listener;
    private View childView;
    private GestureDetector gestureDetector;
    private int childViewPosition;
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        this.gestureDetector = new GestureDetector(context, new GestureListener());
        this.listener = listener;
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        childView = rv.findChildViewUnder(e.getX(), e.getY());
        childViewPosition = rv.getChildPosition(childView);
        return childView != null && gestureDetector.onTouchEvent(e);
    }
    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
    protected class GestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent event) {
            if (childView != null) {
                listener.onItemClick(childView, childViewPosition);
            }
            return true;
        }
        @Override
        public void onLongPress(MotionEvent event) {
            if (childView != null) {
                listener.onItemLongPress(childView, childViewPosition);
            }
        }
        @Override
        public boolean onDown(MotionEvent event) {
            // Best practice to always return true here.
            // http://developer.android.com/training/gestures/detector.html#detect
            return true;
        }
    }
    public interface OnItemClickListener{
        public void onItemClick(View childView, int position);
        public void onItemLongPress(View childView, int position);
    }
    public static abstract class SimpleOnItemClickListener implements OnItemClickListener {
        public void onItemClick(View childView, int position) {
            // Do nothing.
        }
        public void onItemLongPress(View childView, int position) {
            // Do nothing.
        }
    }

}

然后在调用的时候要这么些写,
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getContext(),new OnItemClickListener()));
 private class OnItemClickListener extends RecyclerItemClickListener.SimpleOnItemClickListener {
        @Override
        public void onItemClick(View childView, int position) {
            Toast.makeText(getContext(),"点击第几个Item:" + position,Toast.LENGTH_SHORT).show();
        }
    }

个人感觉这种方式好在于封装,模拟了listView的点击方式,能拿到postion



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView折叠效果的实现可以通过自定义 RecyclerView.Adapter 实现。 1. 在 RecyclerView.Adapter 中定义一个 boolean 类型的变量用于记录当前 item 的展开状态。 2. 在 onBindViewHolder 方法中判断当前 item 是否展开,根据展开状态设置 item 的高度。如果当前 item 是展开状态,则高度为全部内容的高度;否则,高度为折叠后的高度。 3. 在 item 的点事件中,改变展开状态并调用 notifyDataSetChanged() 方法刷新数据。 以下是示例代码: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private boolean isExpanded = false; // 记录当前 item 是否展开 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 创建 ViewHolder View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { // 绑定数据 if (isExpanded) { // 如果当前 item 是展开状态,则设置 item 的高度为全部内容的高度 holder.itemView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; } else { // 否则,高度为折叠后的高度 holder.itemView.getLayoutParams().height = 200; } } @Override public int getItemCount() { // 返回数据集大小 return 10; } class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View itemView) { super(itemView); // 设置 item 的点事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 改变展开状态 isExpanded = !isExpanded; // 刷新数据 notifyDataSetChanged(); } }); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值