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()");