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

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

activity_tabhost.xml




    

        

            

                

            

            

            

        

        
    

    

fragment_friends.xml




    

        

    


fragment_message.xml




    


fragment_mine.xml




    


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




    
    
    


在drawable创建color_navigation_selector.xml



    
    

这是底部导航栏样式

image

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

activity_add_friends.xml




    

        

            

                

            

            

        

        
        

        

    

    

        

        

    



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> listdata = new ArrayList<>();
    private Gson gson;

    @Override
    protected 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() {
            @Override
            public boolean onQueryTextSubmit(String account) {
                listdata.clear();
                loadingUtils.show();
                loadFriend(account);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.ll_return:
                finish();
                break;
            default:
                break;
        }
    }

    private void loadFriend(final String account) {
        List accounts = new ArrayList<>();
        accounts.add(account);
        NIMClient.getService(UserService.class).fetchUserInfo(accounts)
                .setCallback(new RequestCallback>() {
                    @Override
                    public void onSuccess(List 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("未搜索到用户");
                        }
                    }

                    @Override
                    public void onFailed(int code) {
                        Log.i(TAG, "code: " + code);
                        loadingUtils.dismiss();
                    }

                    @Override
                    public void onException(Throwable exception) {
                        loadingUtils.dismiss();
                    }
                });
    }

}

好友信息展示

activity_friend_info.xml




    

        

            

                

            

        

        

            

            

                

                    

                    

                

                

            

        

        

            

            

        

        

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




    

    



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聊天软件开发(基于网易云IM即时通讯)——添加好友(三))