Android聊天软件开发(基于网易云IM即时通讯)——添加好友(三)
16lz
2021-12-22
这里先搭建viewpage+BottomNavigationView+Fragment的底部导航栏
activity_tabhost.xml
<?xml version="1.0" encoding="utf-8"?>
fragment_friends.xml
<?xml version="1.0" encoding="utf-8"?>
fragment_message.xml
<?xml version="1.0" encoding="utf-8"?>
fragment_mine.xml
<?xml version="1.0" encoding="utf-8"?>
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; } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public 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; @Override protected 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() { //以下三个方法是需要重写的父类方法 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { ////当页面滑动,即当前页面滑动时调用 } @Override public 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; } } @Override public void onPageScrollStateChanged(int state) { //当滚动状态发生变化时,比如从滚动变到不滚动时调用 } }); //配置viewPager的页面随navigation的选中项变化 navigationView.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public 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); } @Override public 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; @Override public 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 friends = NIMClient.getService(FriendService.class).getFriendAccounts(); NIMClient.getService(UserService.class).fetchUserInfo(friends) .setCallback(new RequestCallback>() { @Override public void onSuccess(List 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() { @Override public 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); } }); } } @Override public void onFailed(int code) { } @Override public 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 { @Override public 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 { @Override public 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"?>
在drawable创建color_navigation_selector.xml
<?xml version="1.0" encoding="utf-8"?>
这是底部导航栏样式
接下来,我们开始写好友搜索
activity_add_friends.xml
<?xml version="1.0" encoding="utf-8"?>
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
好友信息展示
activity_friend_info.xml
<?xml version="1.0" encoding="utf-8"?>
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"; @Override protected 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; } } @Override public 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() { @Override public void onSuccess(Void param) { loadingUtils.dismiss(); NormalDialogOneBtn("添加好友成功", 200); } @Override public void onFailed(int code) { loadingUtils.dismiss(); NormalDialogOneBtn("添加好友失敗", 414); } @Override public 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() { @Override public void onBtnClick() { dialog.dismiss(); if (code == 200) { finish(); } } }); }}
使用aadapter来好友列表显示
item_friend.xml
<?xml version="1.0" encoding="utf-8"?>
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 { private List 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 listdata) { this.context = context; this.listdata = listdata; mInflater = LayoutInflater.from(context); } @NonNull @Override public FriendHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View convertView = mInflater.inflate(R.layout.item_friend, viewGroup, false); FriendHolder viewHolder = new FriendHolder(convertView); return viewHolder; } @Override public 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() { @Override public void onClick(View v) { int layoutPosition = holder.getLayoutPosition(); mOnItemClickListener.onItemClick(holder.itemView, layoutPosition); } }); } } @Override public int getItemCount() { return listdata.size(); } public void setData(int position, List 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); }}
项目下载地址:https://download.csdn.net/download/qq_32090185/11122479
下一章介绍发送消息(文本)
更多相关文章
- android 系统自带的图标集合
- android 状态栏显示运行图标
- 【译】Android(安卓)23最新接口变化(Android(安卓)API Difference
- 【Android】利用广播BroadCast监听网络的变化
- Android获取apk的版本及包名等信息
- Android(安卓)获取设备电池电量
- Android所有系统资源图标android.R.drawable.xxx查看
- 30个高质量并且免费的Android图标【Android(安卓)Icon素材】
- 酷炫的Android(安卓)QQ 开源了吧!!