微信消息列表(RecycleView)双击移动未读消息

private int lastUnreadIndex = -1;
private List<Integer> unreadIndexs = new ArrayList<>();
 // 单个item高度
private int itemHeight = DisplayUtils.dp2px(100f);

   
public void scrollToUnreadMessage() {
        LayoutManager mLayoutManager = getLayoutManager();
        if (mLayoutManager == null) return;
        if (!(mLayoutManager instanceof LinearLayoutManager)) return;

        LinearLayoutManager mLinearLayoutManager = (LinearLayoutManager) mLayoutManager;
        unreadIndexs.clear();

        for (int i = 0;i< mAdapter.getItemCount(); i++) {
            ConversationInfo mConversationInfo = mAdapter.getItem(i);
            if (mConversationInfo.getUnRead() > 0) {
                unreadIndexs.add(i);
            }
        }

        int unreadPos = 0;
        if (unreadIndexs.size() > 0) {
            lastUnreadIndex = (++lastUnreadIndex) % unreadIndexs.size();
            unreadPos = unreadIndexs.get(lastUnreadIndex);
        }
        // 所有的移动距离都以 firstVisibleItemPosition 来做参照
        int firstVisibleItemPosition = mLinearLayoutManager.findFirstVisibleItemPosition();
        // 获取到当前参照view的偏移量
        View firstView = mLinearLayoutManager.findViewByPosition(firstVisibleItemPosition);
        if (firstView == null) return;
        if (firstView.getHeight() != 0) {
            itemHeight = firstView.getHeight();
        }
        int top = firstView.getTop();
        // 移动目标位置大于参照view postion
        // (这里item为等高)如果包含headview移动距离必须考虑到Headview的高度
        if (unreadPos > firstVisibleItemPosition) {
            int transPostion = unreadPos - firstVisibleItemPosition;
            smoothScrollBy(0, (transPostion * itemHeight + top));
            // 移动目标位置小于参照view postion
        } else if (unreadPos < firstVisibleItemPosition) {
            int transPostion = firstVisibleItemPosition - unreadPos;
            smoothScrollBy(0, -(transPostion * itemHeight - top));
        } else {
            // 移动目标位置等于参照view postion
            smoothScrollBy(0, top);
        }
    }
    ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值