今日完成
聊天页面
主fragment
package com.example.meet.fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.example.meet.R;
import com.example.meet.fragment.chat.AllFriendFragment;
import com.example.meet.fragment.chat.CallRecordFragment;
import com.example.meet.fragment.chat.ChatRecordFragment;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class ChatFragment extends Fragment {
private TabLayout mTabLayout;
private ViewPager mViewPager;
private String[] mTitle;
private List<Fragment> mFragmentList = new ArrayList<>();
private AllFriendFragment allFriendFragment;
private CallRecordFragment callRecordFragment;
private ChatRecordFragment chatRecordFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_chat,null);
initView(view);
return view;
}
private void initView(View view) {
mTabLayout = (TabLayout) view.findViewById(R.id.mTabLayout);
mViewPager = (ViewPager) view.findViewById(R.id.mViewPager);
//标题
mTitle = new String[]{getString(R.string.text_chat_tab_title_1),
getString(R.string.text_chat_tab_title_2),
getString(R.string.text_chat_tab_title_3)};
allFriendFragment = new AllFriendFragment();
callRecordFragment = new CallRecordFragment();
chatRecordFragment = new ChatRecordFragment();
mFragmentList.add(chatRecordFragment);
mFragmentList.add(callRecordFragment);
mFragmentList.add(allFriendFragment);
for (int i = 0; i < mTitle.length; i++) {
mTabLayout.addTab(mTabLayout.newTab().setText(mTitle[i]));
}
mViewPager.setOffscreenPageLimit(mTitle.length);
mViewPager.setAdapter(new ChatPagerAdapter(getFragmentManager()));
mTabLayout.setupWithViewPager(mViewPager);
mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
defTabStyle(tab,20);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tab.setCustomView(null);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
//默认第一个选中
defTabStyle(mTabLayout.getTabAt(0),20);
}
/**
* 设置tab样式
* @param tabAt
* @param i
*/
private void defTabStyle(TabLayout.Tab tabAt, int i) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_tab_text, null);
TextView tv_table = view.findViewById(R.id.tv_tab);
tv_table.setText(tabAt.getText());
tv_table.setTextColor(Color.WHITE);
tv_table.setTextSize(i);
tabAt.setCustomView(tv_table);
}
class ChatPagerAdapter extends FragmentStatePagerAdapter{
public ChatPagerAdapter( FragmentManager fm) {
super(fm);
}
@Override
public void destroyItem(@NonNull View container, int position, @NonNull Object object) {
// super.destroyItem(container, position, object);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mTitle.length;
}
@Override
public CharSequence getPageTitle(int position) {
return mTitle[position];
}
}
}
聊天记录fragment
package com.example.meet.fragment.chat;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.framework.adapter.CommonAdapter;
import com.example.framework.adapter.CommonViewHolder;
import com.example.framework.bmob.BmobManager;
import com.example.framework.bmob.MyMeetUser;
import com.example.framework.cloud.CloudManager;
import com.example.framework.gson.TextBean;
import com.example.framework.utils.CommonUtils;
import com.example.framework.utils.LogUtils;
import com.example.meet.R;
import com.example.meet.model.ChatRecordModel;
import com.google.gson.Gson;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.message.TextMessage;
/**
* A simple {@link Fragment} subclass.
*/
public class ChatRecordFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private SwipeRefreshLayout mChatRecordRefreshLayout;
private RecyclerView mChatRecordView;
private View emptyView;
private CommonAdapter<ChatRecordModel> adapter;
private List<ChatRecordModel> modelList = new ArrayList<>();
public ChatRecordFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_record, null);
initView(view);
return view;
}
private void initView(final View view) {
mChatRecordRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.mChatRecordRefreshLayout);
mChatRecordView = (RecyclerView) view.findViewById(R.id.mChatRecordView);
emptyView = view.findViewById(R.id.item_empty_view);
mChatRecordRefreshLayout.setOnRefreshListener(this);
mChatRecordView.setLayoutManager(new LinearLayoutManager(getActivity()));
mChatRecordView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL));
//适配器
adapter = new CommonAdapter<>(modelList, new CommonAdapter.OnBindDataListener<ChatRecordModel>() {
@Override
public void onBindViewHolder(ChatRecordModel model, CommonViewHolder viewHolder, int type, int position) {
viewHolder.setImageUrl(getActivity(),R.id.iv_photo,model.getPhotoUrl());
viewHolder.setText(R.id.tv_nickname,model.getNickName());
viewHolder.setText(R.id.tv_msg,model.getLastMsg());
viewHolder.setText(R.id.tv_time,model.getTime());
if (model.getUnReadNumber() == 0){
viewHolder.getView(R.id.tv_un_read).setVisibility(View.GONE);
}else {
viewHolder.getView(R.id.tv_un_read).setVisibility(View.VISIBLE);
viewHolder.setText(R.id.tv_un_read,model.getUnReadNumber() + "");
}
}
@Override
public int getLayoutId(int type) {
return R.layout.layout_chat_record_item;
}
});
mChatRecordView.setAdapter(adapter);
queryChatRecord();
}
/**
* 查询聊天列表
*/
private void queryChatRecord() {
mChatRecordRefreshLayout.setRefreshing(true);
CloudManager.getInstance().getConversationList(new RongIMClient.ResultCallback<List<Conversation>>() {
@Override
public void onSuccess(List<Conversation> conversations) {
mChatRecordRefreshLayout.setRefreshing(false);
if (CommonUtils.isEmpty(conversations)){
//先把之前的列表情况,防止再次查询重复
if (modelList.size()>0){
modelList.clear();
}
LogUtils.e("进入查询:" + conversations.size());
for (int i = 0; i < conversations.size(); i++) {
final Conversation conversation = conversations.get(i);
//获取发送人的信息
String id = conversation.getTargetId();
//查询该人并填充数据
BmobManager.getInstance().queryUserById(id, new FindListener<MyMeetUser>() {
@Override
public void done(List<MyMeetUser> object, BmobException e) {
if (e == null){
if (CommonUtils.isEmpty(object)){
MyMeetUser myMeetUser = object.get(0);
ChatRecordModel chatRecordModel = new ChatRecordModel();
chatRecordModel.setPhotoUrl(myMeetUser.getPhoto());
chatRecordModel.setNickName(myMeetUser.getNickName());
chatRecordModel.setTime(new SimpleDateFormat("HH:mm:ss")
.format(conversation.getReceivedTime()));
chatRecordModel.setUnReadNumber(conversation.getUnreadMessageCount());
//判断消息的类型
String objectName = conversation.getObjectName();
if (objectName.equals(CloudManager.MESSAGE_TYPE_TEXT)){
TextMessage textMessage = (TextMessage) conversation.getLatestMessage();
String msg = textMessage.getContent();
TextBean textBean = new Gson().fromJson(msg, TextBean.class);
if (textBean.getType().equals(CloudManager.TYPE_TEXT)){
chatRecordModel.setLastMsg(textBean.getMsg());
modelList.add(chatRecordModel);
}
}else if (objectName.equals(CloudManager.MESSAGE_TYPE_LOCATION)){
chatRecordModel.setLastMsg(getString(R.string.text_chat_record_img));
modelList.add(chatRecordModel);
}else if (objectName.equals(CloudManager.MESSAGE_TYPE_VOICE)){
chatRecordModel.setLastMsg(getString(R.string.text_chat_record_location));
modelList.add(chatRecordModel);
}
adapter.notifyDataSetChanged();
if (modelList.size() > 0){
emptyView.setVisibility(View.GONE);
mChatRecordView.setVisibility(View.VISIBLE);
}else {
emptyView.setVisibility(View.VISIBLE);
mChatRecordView.setVisibility(View.GONE);
}
}
}
}
});
}
}else {
mChatRecordRefreshLayout.setRefreshing(false);
emptyView.setVisibility(View.VISIBLE);
mChatRecordView.setVisibility(View.GONE);
}
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
mChatRecordRefreshLayout.setRefreshing(false);
}
});
}
@Override
public void onRefresh() {
if (mChatRecordRefreshLayout.isRefreshing()){
queryChatRecord();
}
}
}
界面
![](https://img2020.cnblogs.com/blog/1717425/202004/1717425-20200421220602720-690486736.png)