这里先搭建viewpage+BottomNavigationView+Fragment的底部导航栏

activity_tabhost.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_above="@+id/bnv_viewpager"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="44dp"android:background="@color/deepskyblue"android:orientation="horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentStart="true"android:gravity="center_vertical"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="20dp"android:textColor="@color/white"android:textSize="20sp" /></LinearLayout><ImageViewandroid:id="@+id/iv_add"android:layout_width="20dp"android:layout_height="20dp"android:layout_alignParentEnd="true"android:layout_marginTop="12dp"android:layout_marginEnd="20dp"android:contentDescription="@string/tv_icon"android:src="@drawable/add" /><ImageViewandroid:id="@+id/iv_search"android:layout_width="20dp"android:layout_height="20dp"android:layout_marginTop="12dp"android:layout_marginEnd="20dp"android:layout_toStartOf="@id/iv_add"android:src="@drawable/search" /></RelativeLayout><android.support.v4.view.ViewPagerandroid:id="@+id/vp_viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout><android.support.design.widget.BottomNavigationViewandroid:id="@+id/bnv_viewpager"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@color/lightgrey"app:itemTextColor="@drawable/color_navigation_selector"app:menu="@menu/navigation" />
</RelativeLayout>

fragment_friends.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".friend.FriendsFragment"><com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/srl_refresh_layout"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_friends"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="10dp" /></com.scwang.smartrefresh.layout.SmartRefreshLayout></FrameLayout>

fragment_message.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".message.MessageFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/hello_blank_fragment" /></FrameLayout>

fragment_mine.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".message.MessageFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/hello_blank_fragment" /></FrameLayout>

ViewPagerFragmentAdapter

package heath.com.chat.adapter;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {private Fragment[] fragments;public ViewPagerFragmentAdapter(FragmentManager fm, Fragment[] fragments) {super(fm);this.fragments=fragments;}@Overridepublic Fragment getItem(int position) {return fragments[position];}@Overridepublic int getCount() {return fragments.length;}
}

TabHostActivity

package heath.com.chat;import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;import heath.com.chat.adapter.ViewPagerFragmentAdapter;
import heath.com.chat.friend.AddFriendsActivity;
import heath.com.chat.friend.FriendsFragment;
import heath.com.chat.message.MessageFragment;
import heath.com.chat.mine.MineFragment;public class TabHostActivity extends BaseActivity implements View.OnClickListener {private ImageView mIvAdd;private BottomNavigationView navigationView;private ViewPager viewPager;private Fragment[] fragments;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tabhost);//初始化控件initView();initListener();//将各个fragment加入到fragments中addFragment();//将viewPager和BottomNavigationView的选择事件连接起来link();//设置viewPager的适配器ViewPagerFragmentAdapter adapter = new ViewPagerFragmentAdapter(getSupportFragmentManager(), fragments);viewPager.setAdapter(adapter);//设置初始的页面项navigationView.setSelectedItemId(R.id.navigation_message);}/*** 初始化控件*/private void initView() {mIvAdd = this.findViewById(R.id.iv_add);navigationView = this.findViewById(R.id.bnv_viewpager);viewPager = this.findViewById(R.id.vp_viewpager);//将控件默认的图标隐藏,以显示自定义的按钮图标navigationView.setItemIconTintList(null);}private void initListener() {mIvAdd.setOnClickListener(this);}/*** 填充fragments*/private void addFragment() {fragments = new Fragment[]{new MessageFragment(),new FriendsFragment(),new MineFragment()};}/*** 将viewPager和BottomNavigationView的事件连接起来* 分为两步* 1.给viewPager添加监听事件,即viewPager的页面变化时,navigation的选中项跟随变化* 2.给navigation添加监听事件,即当navigation的选中项变化时,viewPager的页面跟随变化*/private void link() {//给viewPager设置监听事件,使viewPager页面变化时BottomNavigationView的item跟随其变化viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {//以下三个方法是需要重写的父类方法@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {当页面滑动,即当前页面滑动时调用}@Overridepublic void onPageSelected(int position) {//当viewpager选定(滑动)后调用switch (position) {case 0:navigationView.setSelectedItemId(R.id.navigation_message);break;case 1:navigationView.setSelectedItemId(R.id.navigation_friends);break;case 2:navigationView.setSelectedItemId(R.id.navigation_mine);break;}}@Overridepublic void onPageScrollStateChanged(int state) {//当滚动状态发生变化时,比如从滚动变到不滚动时调用}});//配置viewPager的页面随navigation的选中项变化navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {//每次点击后都将所有图标重置到默认不选中图片resetToDefaultIcon();switch (item.getItemId()) {case R.id.navigation_message:viewPager.setCurrentItem(0);//设置按钮的图标item.setIcon(R.drawable.select_message);return true;case R.id.navigation_friends:viewPager.setCurrentItem(1);//设置按钮的图标item.setIcon(R.drawable.select_friends);return true;case R.id.navigation_mine:viewPager.setCurrentItem(2);//设置按钮的图标item.setIcon(R.drawable.select_mine);return true;}return false;}});}/*** 重置按钮的图片为未选中的图标*/private void resetToDefaultIcon() {navigationView.getMenu().findItem(R.id.navigation_message).setIcon(R.drawable.unselect_message);navigationView.getMenu().findItem(R.id.navigation_friends).setIcon(R.drawable.unselect_friends);navigationView.getMenu().findItem(R.id.navigation_mine).setIcon(R.drawable.unselect_mine);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.iv_add:startActivity(new Intent(TabHostActivity.this, AddFriendsActivity.class));break;default:break;}}
}

FriendsFragment

package heath.com.chat.friend;import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.friend.FriendService;
import com.netease.nimlib.sdk.uinfo.UserService;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
import com.netease.nimlib.sdk.uinfo.model.UserInfo;import java.util.HashMap;
import java.util.List;import heath.com.chat.R;
import heath.com.chat.adapter.FriendAdapter;public class FriendsFragment extends Fragment {private RecyclerView mRvFriends;private FriendAdapter friendAdapter;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_friends, container,false);initView(view);init();return view;}private void initView(View view) {mRvFriends = view.findViewById(R.id.rv_friends);}private void init(){List<String> friends = NIMClient.getService(FriendService.class).getFriendAccounts();NIMClient.getService(UserService.class).fetchUserInfo(friends).setCallback(new RequestCallback<List<NimUserInfo>>() {@Overridepublic void onSuccess(List<NimUserInfo> param) {if (param.size()>0){friendAdapter = new FriendAdapter(getActivity(), param);mRvFriends.setAdapter(friendAdapter);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);mRvFriends.setLayoutManager(linearLayoutManager);mRvFriends.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));friendAdapter.setOnItemClickListener(new FriendAdapter.OnItemClickListener() {@Overridepublic void onItemClick(View view, int position) {NimUserInfo nimUserInfo = param.get(position);Intent intent = new Intent(getActivity(),FriendInfoActivity.class);intent.putExtra("nimUserInfo", nimUserInfo);startActivityForResult(intent, 0);}});}}@Overridepublic void onFailed(int code) {}@Overridepublic void onException(Throwable exception) {}});}
}

MessageFragment

package heath.com.chat.message;import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import heath.com.chat.R;public class MessageFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_message, container,false);return view;}
}

MineFragment

package heath.com.chat.mine;import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import heath.com.chat.R;public class MineFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_mine, container,false);return view;}
}

在res文件夹下创建一个menu的文件夹,里面放navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/navigation_message"android:icon="@drawable/unselect_message"android:title="@string/tv_message" /><itemandroid:id="@+id/navigation_friends"android:icon="@drawable/unselect_friends"android:title="@string/tv_friend" /><itemandroid:id="@+id/navigation_mine"android:icon="@drawable/unselect_mine"android:title="@string/tv_mine" />
</menu>

在drawable创建color_navigation_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="@color/deepskyblue" android:state_checked="true" /><item android:color="@color/gainsboro" android:state_checked="false" />
</selector>

这是底部导航栏样式

接下来,我们开始写好友搜索

activity_add_friends.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="44dp"android:orientation="horizontal"android:gravity="center_vertical"android:background="@color/deepskyblue"><LinearLayoutandroid:id="@+id/ll_return"android:layout_width="44sp"android:layout_height="44sp"android:gravity="center_vertical"><ImageViewandroid:layout_width="24sp"android:layout_height="24sp"android:src="@drawable/return1"android:layout_marginStart="20dp"android:contentDescription="@string/tv_icon_des"/></LinearLayout><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/tv_add_friends"android:textColor="@color/white"android:textSize="20sp"android:layout_marginStart="20dp"/></LinearLayout><SearchViewandroid:id="@+id/sv_search_friends"android:layout_width="match_parent"android:layout_height="40dp"android:iconifiedByDefault="false"android:queryBackground="@null"android:submitBackground="@null"android:background="@drawable/searchview_line"></SearchView><TextViewandroid:id="@+id/tv_result"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"/></LinearLayout><RelativeLayoutandroid:id="@+id/rl_loading"android:layout_width="150dp"android:layout_height="150dp"android:layout_gravity="center"android:background="@drawable/shape_label_clarity_black"><com.github.ybq.android.spinkit.SpinKitViewxmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/pb_loading"style="@style/SpinKitView.Large.Circle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"app:SpinKit_Color="@color/white" /><TextViewandroid:id="@+id/tv_loading_text"android:layout_below="@id/pb_loading"android:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/white"/></RelativeLayout></FrameLayout>

AddFriendsActivity

package heath.com.chat.friend;import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.TextView;import com.google.gson.Gson;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.uinfo.UserService;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;import java.util.ArrayList;
import java.util.List;
import java.util.Map;import heath.com.chat.BaseActivity;
import heath.com.chat.R;
import heath.com.chat.utils.LoadingUtils;public class AddFriendsActivity extends BaseActivity implements View.OnClickListener {private String TAG = "friend";private SearchView mSvSearchFriends;private LinearLayout mLlReturn;private TextView mTvResult;private LoadingUtils loadingUtils;final ArrayList<Map<String, Object>> listdata = new ArrayList<>();private Gson gson;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_friends);initView();init();initListener();}private void initView() {mSvSearchFriends = this.findViewById(R.id.sv_search_friends);mLlReturn = this.findViewById(R.id.ll_return);mTvResult = this.findViewById(R.id.tv_result);gson = new Gson();loadingUtils = new LoadingUtils(AddFriendsActivity.this, "正在搜索");}private void init() {loadingUtils.creat();}private void initListener() {mLlReturn.setOnClickListener(this);mSvSearchFriends.setSubmitButtonEnabled(false);mSvSearchFriends.setQueryHint("查找好友");mSvSearchFriends.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String account) {listdata.clear();loadingUtils.show();loadFriend(account);return false;}@Overridepublic boolean onQueryTextChange(String s) {return false;}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.ll_return:finish();break;default:break;}}private void loadFriend(final String account) {List<String> accounts = new ArrayList<>();accounts.add(account);NIMClient.getService(UserService.class).fetchUserInfo(accounts).setCallback(new RequestCallback<List<NimUserInfo>>() {@Overridepublic void onSuccess(List<NimUserInfo> param) {loadingUtils.dismiss();if (param.size() > 0) {Log.i(TAG, "loadFriend: " + param.get(0).getAccount());Intent intent = new Intent(AddFriendsActivity.this,FriendInfoActivity.class);intent.putExtra("nimUserInfo", param.get(0));startActivityForResult(intent, 0);} else {mTvResult.setText("未搜索到用户");}}@Overridepublic void onFailed(int code) {Log.i(TAG, "code: " + code);loadingUtils.dismiss();}@Overridepublic void onException(Throwable exception) {loadingUtils.dismiss();}});}}

好友信息展示

activity_friend_info.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/lightgrey"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="44dp"android:background="@color/deepskyblue"android:gravity="center_vertical"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/ll_return"android:layout_width="44sp"android:layout_height="44sp"android:gravity="center_vertical"><ImageViewandroid:layout_width="24sp"android:layout_height="24sp"android:layout_marginStart="20dp"android:contentDescription="@string/tv_icon_des"android:src="@drawable/return1" /></LinearLayout></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="80dp"android:layout_marginTop="20dp"android:background="@color/white"android:gravity="center_vertical"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_head_photo"android:layout_width="60dp"android:layout_height="60dp"android:layout_marginStart="10dp"android:layout_marginEnd="10dp"android:contentDescription="@string/tv_icon_des"android:src="@drawable/test" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="60dp"android:layout_gravity="center_vertical"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="30dp"android:layout_gravity="center_vertical"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_nickname"android:layout_width="wrap_content"android:layout_height="fill_parent"android:gravity="center_vertical"android:textColor="@color/black" /><ImageViewandroid:id="@+id/iv_sex"android:layout_width="16dp"android:layout_height="16dp"android:layout_marginStart="10dp"android:layout_marginEnd="10dp"android:layout_marginTop="7dp"android:contentDescription="@string/tv_icon_des"android:src="@drawable/girl" /></LinearLayout><TextViewandroid:id="@+id/tv_address"android:layout_width="wrap_content"android:layout_height="30dp"android:gravity="center_vertical"android:textColor="@color/grey" /></LinearLayout></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:background="@color/white"android:orientation="horizontal"android:layout_marginTop="1dp"android:gravity="center_vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:text="@string/tv_sign"android:textColor="@color/black2"/><TextViewandroid:id="@+id/tv_sign"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:text="@string/tv_unfilled"android:textColor="@color/grey"/></LinearLayout><Buttonandroid:id="@+id/btn_add_friend"android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/white"android:layout_marginTop="10dp"android:text="@string/tv_add_friend"android:textColor="@color/deepskyblue"/><Buttonandroid:id="@+id/btn_send_message"android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/white"android:layout_marginTop="10dp"android:text="@string/btn_send_message"android:textColor="@color/deepskyblue"/></LinearLayout><RelativeLayoutandroid:id="@+id/rl_loading"android:layout_width="150dp"android:layout_height="150dp"android:layout_gravity="center"android:background="@drawable/shape_label_clarity_black"><com.github.ybq.android.spinkit.SpinKitView xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/pb_loading"style="@style/SpinKitView.Large.Circle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"app:SpinKit_Color="@color/white" /><TextViewandroid:id="@+id/tv_loading_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/pb_loading"android:layout_centerHorizontal="true"android:textColor="@color/white" /></RelativeLayout></FrameLayout>

FriendInfoActivity

package heath.com.chat.friend;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import com.flyco.animation.BaseAnimatorSet;
import com.flyco.animation.BounceEnter.BounceTopEnter;
import com.flyco.animation.SlideExit.SlideBottomExit;
import com.flyco.dialog.listener.OnBtnClickL;
import com.flyco.dialog.widget.NormalDialog;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.friend.FriendService;
import com.netease.nimlib.sdk.friend.constant.VerifyType;
import com.netease.nimlib.sdk.friend.model.AddFriendData;
import com.netease.nimlib.sdk.uinfo.constant.GenderEnum;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;import org.json.JSONObject;import java.util.HashMap;
import java.util.Map;import heath.com.chat.BaseActivity;
import heath.com.chat.LoginActivity;
import heath.com.chat.OKhttp.IHttpClient;
import heath.com.chat.OKhttp.IRequest;
import heath.com.chat.OKhttp.IResponse;
import heath.com.chat.OKhttp.impl.OkHttpClientImpl;
import heath.com.chat.OKhttp.impl.RequestImpl;
import heath.com.chat.R;
import heath.com.chat.utils.Common;
import heath.com.chat.utils.LoadingUtils;
import heath.com.chat.utils.ThreadUtils;public class FriendInfoActivity extends BaseActivity implements View.OnClickListener {private LinearLayout mLlReturn;private ImageView mIvHeadPhoto;private TextView mTvNickname;private ImageView mIvSex;private TextView mTvAddress;private TextView mTvSign;private Button mBtnAddFriend;private Button mBtnSendMessage;private NimUserInfo nimUserInfo;protected LoadingUtils loadingUtils;private BaseAnimatorSet mBasIn;private BaseAnimatorSet mBasOut;private LoginInfo loginInfo;private String TAG = "friend";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_friend_info);initView();initListener();init();}private void initView() {mLlReturn = this.findViewById(R.id.ll_return);mIvHeadPhoto = this.findViewById(R.id.iv_head_photo);mTvNickname = this.findViewById(R.id.tv_nickname);mIvSex = this.findViewById(R.id.iv_sex);mTvAddress = this.findViewById(R.id.tv_address);mTvSign = this.findViewById(R.id.tv_sign);mBtnAddFriend = this.findViewById(R.id.btn_add_friend);mBtnSendMessage = this.findViewById(R.id.btn_send_message);}private void initListener() {mBtnAddFriend.setOnClickListener(this);mBtnSendMessage.setOnClickListener(this);mLlReturn.setOnClickListener(this);}private void init() {Intent intent = getIntent();nimUserInfo = (NimUserInfo) intent.getSerializableExtra("nimUserInfo");loginInfo = (LoginInfo) aCache.getAsObject("loginInfo");loadingUtils = new LoadingUtils(FriendInfoActivity.this, "添加好友...");mBasIn = new BounceTopEnter();mBasOut = new SlideBottomExit();loadingUtils.creat();if (nimUserInfo.getAccount().equals(loginInfo.getAccount())){mBtnAddFriend.setVisibility(View.GONE);mBtnSendMessage.setVisibility(View.GONE);}else{boolean isMyFriend = NIMClient.getService(FriendService.class).isMyFriend(nimUserInfo.getAccount());Log.i(TAG, "isMyFriend: "+isMyFriend);if (isMyFriend) {mBtnAddFriend.setVisibility(View.GONE);mBtnSendMessage.setVisibility(View.VISIBLE);}else {mBtnAddFriend.setVisibility(View.VISIBLE);mBtnSendMessage.setVisibility(View.GONE);}}if (nimUserInfo.getName() != null) {mTvNickname.setText(nimUserInfo.getName());}if (nimUserInfo.getSignature() != null) {mTvSign.setText(nimUserInfo.getSignature());}GenderEnum genderEnum = nimUserInfo.getGenderEnum();switch (genderEnum) {case MALE:mIvSex.setImageResource(R.drawable.boy);break;case FEMALE:mIvSex.setImageResource(R.drawable.girl);break;case UNKNOWN:mIvSex.setImageResource(R.drawable.unknown);break;default:mIvSex.setImageResource(R.drawable.unknown);break;}}@Overridepublic void onClick(View v) {switch (v.getId()) {default:break;case R.id.btn_add_friend:loadingUtils.show();addFriend();break;case R.id.btn_send_message:break;case R.id.ll_return:finish();break;}}private void addFriend() {final VerifyType verifyType = VerifyType.DIRECT_ADD; // DIRECT_ADD 直接加对方为好友;VERIFY_REQUEST 发起好友验证请求String msg = "好友请求附言";NIMClient.getService(FriendService.class).addFriend(new AddFriendData(nimUserInfo.getAccount(), verifyType, msg)).setCallback(new RequestCallback<Void>() {@Overridepublic void onSuccess(Void param) {loadingUtils.dismiss();NormalDialogOneBtn("添加好友成功", 200);}@Overridepublic void onFailed(int code) {loadingUtils.dismiss();NormalDialogOneBtn("添加好友失敗", 414);}@Overridepublic void onException(Throwable exception) {loadingUtils.dismiss();NormalDialogOneBtn("添加好友失敗", 500);}});}private void NormalDialogOneBtn(String msg, int code) {final NormalDialog dialog = new NormalDialog(this);dialog.content(msg)//.btnNum(1).btnText("确定")//.showAnim(mBasIn)//.dismissAnim(mBasOut)//.show();dialog.setOnBtnClickL(new OnBtnClickL() {@Overridepublic void onBtnClick() {dialog.dismiss();if (code == 200) {finish();}}});}
}

使用aadapter来好友列表显示

item_friend.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"android:gravity="center_vertical"android:background="@color/white"><ImageViewandroid:id="@+id/iv_head_photo"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:layout_marginStart="10dp"android:layout_marginEnd="10dp"android:contentDescription="@string/tv_icon"android:src="@drawable/test"/><TextViewandroid:id="@+id/tv_nickname"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:textColor="@color/black2"/></LinearLayout>

FriendAdapter.java

package heath.com.chat.adapter;import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;import java.util.Collections;
import java.util.List;import heath.com.chat.R;public class FriendAdapter extends RecyclerView.Adapter<FriendHolder> {private List<NimUserInfo> listdata;private Activity context;private LayoutInflater mInflater;public interface OnItemClickListener {void onItemClick(View view, int position);}private OnItemClickListener mOnItemClickListener;public void setOnItemClickListener(OnItemClickListener listener) {this.mOnItemClickListener = listener;}public FriendAdapter(Activity context, List<NimUserInfo> listdata) {this.context = context;this.listdata = listdata;mInflater = LayoutInflater.from(context);}@NonNull@Overridepublic FriendHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View convertView = mInflater.inflate(R.layout.item_friend, viewGroup, false);FriendHolder viewHolder = new FriendHolder(convertView);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull final FriendHolder holder, int position) {
//        if (listdata.get(position).getUserInfo().getIcon() != null && !listdata.get(position).getUserInfo().getIcon().equals("null")) {
//            ImageUitl imageUitl = new ImageUitl(BaseActivity.cache);
//            imageUitl.asyncloadImage(holder.mIvHeadPhoto, Common.HTTP_ADDRESS + Common.USER_FOLDER_PATH + "/" + listdata.get(position).getUserInfo().getIcon());
//        }if (listdata.get(position).getName() != null) {holder.mTvNickname.setText(listdata.get(position).getName());}if (mOnItemClickListener != null) {holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int layoutPosition = holder.getLayoutPosition();mOnItemClickListener.onItemClick(holder.itemView, layoutPosition);}});}}@Overridepublic int getItemCount() {return listdata.size();}public void setData(int position, List<NimUserInfo> list) {Collections.reverse(list);for (NimUserInfo friendBean : list) {listdata.add(position, friendBean);notifyItemInserted(position);}}}class FriendHolder extends RecyclerView.ViewHolder {ImageView mIvHeadPhoto;TextView mTvNickname;FriendHolder(@NonNull View itemView) {super(itemView);mIvHeadPhoto = itemView.findViewById(R.id.iv_head_photo);mTvNickname = itemView.findViewById(R.id.tv_nickname);}
}

项目下载地址:Android聊天软件开发(基于网易云IM即时通讯)——第三部分_安卓开发聊天-Android代码类资源-CSDN下载

下一章介绍发送消息(文本)

 接单
小编承接外包,有意者可加
QQ:1944300940

微信号:wxid_g8o2y9ninzpp12

Android聊天软件开发(基于网易云IM即时通讯)——添加好友(三)相关推荐

  1. 基于android的个人理财软件 android stu_Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)...

    OKhttp封装 IRequest package heath.com.chat.OKhttp;import java.util.Map;public interface IRequest {publ ...

  2. 【基于Android聊天软件开发-哔哩哔哩】 https://b23.tv/109B82i

    [基于Android聊天软件开发-哔哩哔哩] https://b23.tv/109B82i https://b23.tv/109B82i Android聊天软件开发(仿QQ) 要求: Android ...

  3. 网易云IM(即时通讯) 集成指南(Android)

    网易云IM(即时通讯) 集成指南(Android) 新手接入指南 网易云官网地址自行观看,开发文档很清楚. 两种集成方式 1.as 通过gradle导入依赖集成 2.手动下载sdk. 我们这里用第一种 ...

  4. android 社交软件开发,基于Android的移动端社交软件的设计与实现

    摘要: 随着移动互联技术以及移动社交的快速发展,市场对移动互联社交软件的需求越来越强烈.为了满足日益增长的移动社交软件的需求的要求,提高软件的服务质量,设计开发一套移动社交软件很有必要.在这样的背景下 ...

  5. im即时通讯聊天软件,完整的一套即时通讯IM源码

    非常完整的一套即时通讯IM源码,包含数据库+服务端源码+服务端部署软件+PC.Web.安卓.IOS完整原生源码. 还附带完整的开发文档和视频搭建教程.一套完整得不能在完整的即时通讯源码了,不管拿来二开 ...

  6. android外卖软件开发,基于Android平台的外卖配送软件的设计与实现

    摘要: 随着外卖产业的不断发展,订购外卖已经成为了人们每日的需求.相比于传统的快递服务业,外卖配送有着极高的时效性要求,食物必须保证在极短的时间内送达到客户手中,不然会影响食物的口感和客户的订餐体验. ...

  7. Android聊天软件的开发(三)--网络连接

    一,服务器网络接口    服务器网络接口通过Servlet实现,可以获得客户端提交的数据,对数据进行查询存储操作,以及返回结果数据给客户端.客户端可以通过HTTP协议直接访问网络接口.    HTTP ...

  8. 开发简单Android聊天软件(1)

    总体介绍 开篇 大概思路 一. 客户端主要依赖 二.包引用完成后,创建wsClient类. 三.连接成功后,就可以在对于业务逻辑调用以下方法开始发送消息 开篇 本人是一位开发新人,将自己的开发学习过程 ...

  9. 开发简单Android聊天软件(7)

    构建离线消息获取流程 在 "开发简单Android聊天软件(6)" 中,完成了完成消息接收和加载,构建一个完整的聊天流程. 但是我们只完成了一半,完成存量历史记录展示,和即时聊天的 ...

  10. Android聊天软件的开发(七)--聊天通信

    聊天通信通过Socket实现,大概的框架如下图: 通信流程: 1.服务器在启动时开启聊天服务线程 可以通过ServletContextListener监听Servlet的初始化和销毁,来开启和关闭聊天 ...

最新文章

  1. adodb.RecordSet的属性和方法
  2. 程序员必知的操作系统知识点
  3. wxIntegerValidator< T > 类模板用法
  4. ios 开发证书导出p12文件_开发者在上传企业签名的应用到后,做到如下几点
  5. DOM(二)——XML DOM
  6. 修改手机屏幕刷新率_手机屏幕没有高刷新率算不上旗舰机?看看网友都是如何回答的...
  7. MATLAB显示错误使用untitled,新手,用gui界面画李萨如图,出错,求解答
  8. 表格列隐藏_【excel每日提升】Excel隐藏列,不让别人打开!
  9. Python与数据库(1)mysql
  10. energy in transition课文翻译_思迪软件科技 招聘 字幕翻译(远程兼职)
  11. JQ实现单击按钮 倒计时获取验证码
  12. jwt 长度_跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
  13. UVa 1658,Admiral (拆点+限制最小费用流)
  14. mysql安装配置jdbc_JDBC环境配置
  15. CF1047E Region Separation
  16. TTL转USB电路(CH340G)
  17. 40道C语言大学经典例题及代码(免费 全)
  18. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing...
  19. java多线程 注意事项_多线程使用及注意事项
  20. html找到多行注释报错,前端注释总结

热门文章

  1. 推荐一个死链检测工具“Xenu”
  2. POI多个Sheet生成Excel
  3. 按键精灵手机助手找回素材
  4. 社区团长资金分账该如何高效解决呢?
  5. 完成端口(CompletionPort)详解
  6. Azure School女神相邀,把每分钟都过的更充实
  7. 矩阵理论(一)基本概念的个人理解
  8. 一点点矩阵知识1:由一个矩阵理论题目展开的关于矩阵的核(kernel)与像(Image)的讲解。
  9. 二 详解VBA编程是什么
  10. 基于Spark的GBDT + LR模型实现