Android recyclerView选中Item滚动到屏幕中间 / 指定位置 (完美实现)

之前用这个

rvItemList.scrollToPosition(item.markPosition);

换成这个:

rvItemList.smoothScrollToPosition(position);

 

public class CenterLayoutManager extends LinearLayoutManager {


    public CenterLayoutManager(Context context) {
        super(context);
    }

    public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);


    }

    public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);

    }

    private static class CenterSmoothScroller extends LinearSmoothScroller {

        CenterSmoothScroller(Context context) {
            super(context);
        }

        @Override
        public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
            return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
        }
    }

}

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现RecyclerView点击item后背景平移到选中item,可以通过自定义RecyclerViewItemDecoration来实现。以下是实现的步骤: 1. 在res/drawable文件夹下创建一个selector文件,用来设置RecyclerView item的背景色变化。例如,创建一个名为background_item.xml的文件,代码如下: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimaryDark" /> </shape> </item> <item android:state_selected="true"> <shape android:shape="rectangle"> <solid android:color="@color/colorAccent" /> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimary" /> </shape> </item> </selector> ``` 这里定义了三个状态,分别是按下状态、选中状态和普通状态,分别设置了不同的背景颜色。 2. 在RecyclerView的Adapter中,设置ItemView的背景为上述selector文件,例如: ```kotlin override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) view.setBackgroundResource(R.drawable.background_item) return ViewHolder(view) } ``` 3. 在RecyclerViewItemDecoration中,定义一个变量mSelectedPosition,用于记录当前选中item位置。在item点击事件中,更新mSelectedPosition变量的值,并调用RecyclerView的invalidateItemDecorations()方法刷新ItemDecoration,例如: ```kotlin class CustomItemDecoration : RecyclerView.ItemDecoration() { private val mPaint = Paint() private val mOffset = 20 // 偏移量 private val mTopLeftRectF = RectF() private val mBottomRightRectF = RectF() private var mSelectedPosition = RecyclerView.NO_POSITION // 当前选中item位置 init { mPaint.color = Color.WHITE mPaint.isAntiAlias = true } override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { super.onDraw(c, parent, state) val childCount = parent.childCount for (i in 0 until childCount) { val child = parent.getChildAt(i) val params = child.layoutParams as RecyclerView.LayoutParams // 计算矩形区域 val left = child.left - params.leftMargin - mOffset val top = child.top - params.topMargin - mOffset val right = child.right + params.rightMargin + mOffset val bottom = child.bottom + params.bottomMargin + mOffset mTopLeftRectF.set(left.toFloat(), top.toFloat(), child.left.toFloat(), child.top.toFloat()) mBottomRightRectF.set(child.right.toFloat(), child.bottom.toFloat(), right.toFloat(), bottom.toFloat()) // 绘制背景 if (parent.getChildAdapterPosition(child) == mSelectedPosition) { c.drawRoundRect(mTopLeftRectF, 10f, 10f, mPaint) c.drawRoundRect(mBottomRightRectF, 10f, 10f, mPaint) } } } fun setSelectedPosition(position: Int) { if (mSelectedPosition != position) { mSelectedPosition = position recyclerView?.invalidateItemDecorations() } } } ``` 这里的setSelectedPosition方法用于更新mSelectedPosition变量的值,并调用RecyclerView的invalidateItemDecorations()方法刷新ItemDecoration。 4. 在RecyclerViewitem点击事件中,调用上述ItemDecoration的setSelectedPosition方法更新选中item位置,例如: ```kotlin recyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener { override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { when (e.action) { MotionEvent.ACTION_UP -> { val child = rv.findChildViewUnder(e.x, e.y) if (child != null) { val position = rv.getChildAdapterPosition(child) customItemDecoration.setSelectedPosition(position) // 处理item点击事件 onItemClick(position) return true } } } return false } override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {} override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {} }) ``` 这里的onItemClick方法用于处理item点击事件,具体实现可根据实际需求进行编写。 这样,点击RecyclerViewitem时就能实现背景平移效果并且选中item背景颜色不会消失了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值