android 聊天页面

1.加载历史数据,最新的二十条数据
select * from msgInfo where userId=? and friendId=? order by createTime desc limit 20

2.加载历史数据,加载之前的二十条数据
select * from msgInfo where userId=? and friendId=? order by createTime desc limit ?,20

implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'

布局

 <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/chat_content_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/widget_spacing_20px"
            android:overScrollMode="never" />
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

初始化控件

        refreshLayout.setRefreshHeader(new TalkHeader(this));
        refreshLayout.setEnableLoadMore(false);
        refreshLayout.setNestedScrollingEnabled(false);
        refreshLayout.setEnableScrollContentWhenRefreshed(false);
        refreshLayout.setDisableContentWhenRefresh(false);
        refreshLayout.setOnRefreshListener(this);
        refreshLayout.setEnableAutoLoadMore(false);
        refreshLayout.setEnableNestedScroll(false);
        manager = new LinearLayoutManager(this);
        manager.setSmoothScrollbarEnabled(true);
        manager.setAutoMeasureEnabled(true);
        //反转数据
        manager.setReverseLayout(true);
        chatContentView.setLayoutManager(manager);
        chatContentView.setFocusableInTouchMode(false);
        chatContentView.setNestedScrollingEnabled(false);

TalkHeader.class

package cn.ename.manage.views;

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshKernel;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.constant.RefreshState;
import com.scwang.smartrefresh.layout.constant.SpinnerStyle;
import com.scwang.smartrefresh.layout.internal.ProgressDrawable;
import com.scwang.smartrefresh.layout.util.SmartUtil;

public class TalkHeader extends LinearLayout implements RefreshHeader {

    private ImageView mProgressView;//刷新动画视图
    private ProgressDrawable mProgressDrawable;//刷新动画

    public TalkHeader(Context context) {
        super(context);
        initView(context);
    }

    private void initView(Context context) {
        setGravity(Gravity.CENTER);
        mProgressView = new ImageView(context);
        mProgressDrawable = new ProgressDrawable();
        mProgressView.setImageDrawable(mProgressDrawable);
        addView(mProgressView, SmartUtil.dp2px(20), SmartUtil.dp2px(20));
        setMinimumHeight(SmartUtil.dp2px(60));
    }

    @NonNull
    @Override
    public View getView() {
        return this;
    }

    @NonNull
    @Override
    public SpinnerStyle getSpinnerStyle() {
        return SpinnerStyle.Translate;//指定为平移,不能null
    }

    @Override
    public void setPrimaryColors(int... colors) {

    }

    @Override
    public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) {

    }

    @Override
    public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) {

    }

    @Override
    public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {

    }

    @Override
    public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {

    }

    @Override
    public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) {
        return 0;
    }

    @Override
    public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) {

    }

    @Override
    public boolean isSupportHorizontalDrag() {
        return false;
    }

    @Override
    public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) {
        switch (newState) {
            case None:
                mProgressView.setVisibility(GONE);
            case PullDownToRefresh:
                mProgressView.setVisibility(VISIBLE);
                break;
            case Refreshing:
                mProgressView.setVisibility(VISIBLE);
                break;
            case ReleaseToRefresh:
                mProgressView.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }
}

新数据放在第0位

获取数据之后设置数据

 if (models.size() <= 0) {
            return;
        }
        if (adapter == null) {
            if (friendMsgLists == null) {
                friendMsgLists = new ArrayList<>();
            }
            friendMsgLists.clear();
            friendMsgLists.addAll(models);
            adapter = new ChatAdapter(this, avatar, friendMsgLists);
            chatContentView.setAdapter(adapter);
        } else {
            int position = friendMsgLists.size();
            friendMsgLists.addAll(0, models);
            int currentPosition = friendMsgLists.size();
            adapter.notifyItemRangeInserted(0, currentPosition - position);
        }
        smoothDown();

//设置列表滚动到底部,新消息来的时候只有列表在底部需要往上弹
 public void smoothDown() {
        if (manager.findFirstVisibleItemPosition() != 0)
            return;
        if (chatContentView == null)
            return;
        chatContentView.postDelayed(new Runnable() {
            @Override
            public void run() {
                //页面不存在的时候不执行
                if (manager != null)
                    manager.smoothScrollToPosition(chatContentView, null, 0);
            }
        }, 200);

    }
//设置列表滚动到底部,发送信息或者是弹出输入框的时候,往上弹
 public void smoothDownNever() {
        if (chatContentView == null)
            return;
        chatContentView.postDelayed(new Runnable() {
            @Override
            public void run() {
                //页面不存在的时候不执行
                if (manager != null)
                    manager.smoothScrollToPosition(chatContentView, null, 0);
            }
        }, 200);

    }

发送消息插入本地数据库记录状态,拿到插入的id,之后更新数据库

  baseUtil.addOneRecord("msgInfo", "mId", values);
        HashMap<String, String> map = baseUtil.queryOneRecord("select last_insert_rowid() from msgInfo", new String[]{});
        return map.get("last_insert_rowid()");

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值