package com.example.administrator.imbobo.controller.fragment;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast; import com.example.administrator.imbobo.controller.activity.AddContactActivity;
import com.example.administrator.imbobo.model.Model;
import com.example.administrator.imbobo.model.bean.UserInfo;
import com.example.administrator.imbobo.utils.Constant;
import com.example.administrator.imbobo.utils.SpUtils;
import com.hyphenate.chat.EMClient;
import com.hyphenate.easeui.domain.EaseUser;
import com.hyphenate.easeui.ui.EaseContactListFragment;
import com.example.administrator.imbobo.R;
import com.example.administrator.imbobo.controller.activity.InviteActivity;
import com.hyphenate.exceptions.HyphenateException; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by Leon on 2018/10/6
* Functions: 联系人列表页面 EaseContactListFragment 环信集成的
*/
public class ContactListFragment extends EaseContactListFragment { private ImageView iv_contact_red;
private LocalBroadcastManager mLBM;
private LinearLayout ll_contact_invite;
private String mHxid; //接收到广播的处理
private BroadcastReceiver contactChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//刷新页面
refreshContact();
}
}; //接收到广播的处理
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) { //更新红点显示
iv_contact_red.setVisibility(View.VISIBLE);
SpUtils.getInstance().save(SpUtils.IS_NEW_INVITE,true);
}
}; //接收到广播的处理
private BroadcastReceiver leReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//不要红点显示刚从InviteActivity(邀请信息列表)回来不要显示
iv_contact_red.setVisibility(View.GONE);
SpUtils.getInstance().save(SpUtils.IS_NEW_INVITE,false);
}
}; //initView() 实现EaseContactListFragment中的抽象方法
@Override
protected void initView() {
super.initView(); //布局显示右上角+
titleBar.setRightImageResource(R.drawable.em_add); //头布局添加
View headerView = View.inflate(getActivity(),R.layout.header_fragment_contact,null);
listView.addHeaderView(headerView); //获取红点对象(imageview)
iv_contact_red = (ImageView)headerView.findViewById(R.id.iv_contact_red); //获取邀请信息条目的点击事件
ll_contact_invite = headerView.findViewById(R.id.ll_contact_invite); } //setUpView() 实现EaseContactListFragment中的抽象方法
@Override
protected void setUpView() {
super.setUpView(); //添加按钮的点击事件处理
titleBar.setRightLayoutClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(),AddContactActivity.class);
startActivity(intent);
}
}); //初始化红点的显示
boolean isNewInvite = SpUtils.getInstance().getBooleanPre(SpUtils.IS_NEW_INVITE,false);
iv_contact_red.setVisibility(isNewInvite?View.VISIBLE:View.GONE); //邀请信息条目的点击事件
ll_contact_invite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//红点处理(隐藏掉)
iv_contact_red.setVisibility(View.GONE);
SpUtils.getInstance().save(SpUtils.IS_NEW_INVITE,false); //跳转到邀请信息处理列表页面
Intent intent = new Intent(getActivity(),InviteActivity.class);
startActivity(intent);
}
}); //注册广播
mLBM = LocalBroadcastManager.getInstance(getActivity());
//ContactInviteChangeReceiver - receiver
mLBM.registerReceiver(receiver,new IntentFilter(Constant.CONTACT_INVITE_CHANGED));
mLBM.registerReceiver(leReceiver,new IntentFilter(Constant.LEONBROADCAST));
mLBM.registerReceiver(contactChangeReceiver,new IntentFilter(Constant.CONTACT_CHANGED)); //从环信服务器上获取所有的联系人信息
getContactFromHxServer(); //绑定listView和contextmenu ***********************************************************************************************
registerForContextMenu(listView);
} //创建contextmenu时会调用这个方法**************************************************************************
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//获取环信id先获取postion
int postion = ((AdapterView.AdapterContextMenuInfo)menuInfo).position;
EaseUser easeUser = (EaseUser) listView.getItemAtPosition(postion);
//username 就是 环信id
mHxid = easeUser.getUsername();
//添加布局
getActivity().getMenuInflater().inflate(R.menu.delete,menu);
}   //当contextmenu(listview上的item被选中)被选中时调用这个方法************************************************************
@Override
public boolean onContextItemSelected(MenuItem item) { //R.id.contact_delete 之前写了R.menu.delete 产生了bug
if (item.getItemId() == R.id.contact_delete){
//删除选中的联系人操作
deleteContact(); return true;
} return super.onContextItemSelected(item);
} //删除选中的联系人操作
private void deleteContact(){ //开辟子线程进行网络请求
Model.getInstance().getGloabalThreadPool().execute(new Runnable() {
@Override
public void run() {
try {
//从环信服务器中删除联系人
EMClient.getInstance().contactManager().deleteContact(mHxid); //本地数据库的更新
Model.getInstance().getDbManager().getContactTableDao().deleteContactByHxId(mHxid); //避免空指针异常
if ( getActivity() == null){ return; }
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//toast提示
Toast.makeText(getActivity(),"删除"+mHxid+"成功",Toast.LENGTH_SHORT).show(); //刷新页面
refreshContact();
}
});
} catch (final HyphenateException e) {
e.printStackTrace();
//避免空指针异常
if ( getActivity() == null){ return; }
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//toast提示
Toast.makeText(getActivity(),"删除失败: "+e.toString(),Toast.LENGTH_SHORT).show();
}
}); }
}
}); } //从环信服务器上获取所有的联系人信息
private void getContactFromHxServer(){
//开辟子线程做联网操作
Model.getInstance().getGloabalThreadPool().execute(new Runnable() {
@Override
public void run() {
try {
//获取到所有的好友的环信id
List<String> hxids = EMClient.getInstance().contactManager().getAllContactsFromServer(); //校验- 注意这里用的是>= 0将来要注意异常
if (hxids != null && hxids.size() >= 0){ //创建一个UserInfo的集合
List<UserInfo> contacts = new ArrayList<>(); //转换集合
for (String hxid : hxids){
UserInfo userInfo = new UserInfo(hxid);
contacts.add(userInfo);
} //保存好友信息到本地数据库
Model.getInstance().getDbManager().getContactTableDao().saveContacts(contacts,
true); //避免下面空指针异常(刷新页面)
if (getActivity() == null){ return; }
//刷新页面-回到主线程操作
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//刷新页面的方法
refreshContact();
}
}); } } catch (HyphenateException e) {
e.printStackTrace();
}
}
});
} //刷新页面的方法
private void refreshContact(){ //获取数据
List<UserInfo> contacts = Model.getInstance().getDbManager().getContactTableDao().getCountacts(); //校验获取到的数据 注意这个地方用的是>= 0 可能会有异常
if (contacts != null && contacts.size() >= 0){ // 设置数据 Map<String, EaseUser> contactsMap
Map<String,EaseUser> contactsMap = new HashMap<>(); //数据转换
for (UserInfo contact : contacts){
EaseUser easeUser = new EaseUser(contact.getHxid());
contactsMap.put(contact.getHxid(),easeUser);
} //设置联系人Map,键是hyphenate id。
setContactsMap(contactsMap); //刷新页面
refresh(); }
} @Override
public void onDestroy() { //注册的广播一定要关闭掉
mLBM.unregisterReceiver(receiver);
mLBM.unregisterReceiver(leReceiver);
mLBM.unregisterReceiver(contactChangeReceiver);
super.onDestroy();
}
}

Fragment 中 ListView绑定ContextMenu的更多相关文章

  1. fragment中listview触发事件setOnItemClickListener不好使

    <listView/>中// listview点击 ,高度wrap_content改成fill_prarent

  2. Android开发教程 - 使用Data Binding(四)在Fragment中的使用

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  3. My安卓知识2--使用listview绑定sqlite中的数据

    我想在我的安卓项目中实现一个这样的功能,读取sqlite数据库中的数据并显示到某个页面的listview控件中. 首先,我建立了一个Service类,来实现对数据库的各种操作,然后在这个类中添加对数据 ...

  4. android,在fragment中使用listview,不使用listfragment

    public class LeftFragment extends Fragment{ private ListView listView; @Override public View onCreat ...

  5. WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!

    在 Binding 中使用 ElementName 司空见惯,没见它出过什么事儿.不过当你预见 ContextMenu,或者类似 Grid.Row / Grid.Column 这样的属性中设置的时候, ...

  6. 在Fragment中加一个嵌套了ListView的ScrollView(一)

    首先介绍一下这个程序的功能: 1.顶部有两个可以切换Fragment的Button 2.在其中一个Fragment中里有个ScrollView,ScrollView中有ViewFlipper,List ...

  7. Fragment中添加ListView而不使用ListFragment

    最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...

  8. 无需SherlockActionbar的SlidingMenu使用详解(二)——向Fragment中添加ViewPager和Tab

    之前我们对大体框架有了一定的认识,现在我们来做Fragment界面,其实这里面和这个框架的关系就不大了,但因为有些同学对于在SlidingMenu中切换fragment还是有问题,所以我就在本篇进行详 ...

  9. Fragment中onActivityResult不响应

    开发中遇到Fragment中onActivityResult不响应的问题,曾经见过. 不少同学说处理方法是在与Fragment绑定的FragmentActivity中重写onActivityResul ...

随机推荐

  1. Win10手记-为应用集成SQLite(二)

    接上篇内容,这里给大家分享我的辅助访问类,采用了异步方法,封装了常用的访问操作,一些操作还是纯CLI的. SQLiteDBManager using System; using System.Coll ...

  2. Windows Azure开发之Linux虚拟机

     Windows Azure是微软的云服务集合,用来提供云在线服务所需要的操作系统与基础存储与管理的平台,是微软的云计算的核心组成组件之一.其中windows azure提供的最重要的一项服务就是 ...

  3. python爬取微信信息--显示性别/地域/词云(附代码)

    看到一篇有意思的博客 利用微信开放的接口itchat 可以获取登录的微信好友信息 并且利用图像工具显示分析结果 非常的有意思 记录下实现过程 并提供可执行代码 首先要 import itchat 库 ...

  4. python的数据驱动

    什么叫数据驱动? 登录用例 ->不用的用户名登录,但是自动化化脚本一样,虽然脚本相同,步骤相同,但是不同的用户名登录得出的数据是不一样的,于是就有了数据驱动,就是数据的改变驱动自动化测试的执行导 ...

  5. springboot + mybatis

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...

  6. jquery 回车键实现表单提交

    JQery http://jquery.cuishifeng.cn/keydown.html 键盘事件参考:1.keydown()keydown事件会在键盘按下时触发.2.keyup()keyup事件 ...

  7. mysql 开发进阶篇系列 34 工具篇 mysqlcheck(MyISAM表维护工具)

    一.概述 mysqlcheck客户端工具可以检查和修复MyISAM表,还可以优化和分析表.实际上,它集成了mysql工具中check,repair,analyze,optimize功能,对于check ...

  8. Mongoose基础

    为了保存网站的用户数据和业务数据,通常需要一个**数据库**.**MongoDB**和**Node.js**特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二 ...

  9. [Java初探外篇]__关于正则表达式

    正则表达式通常用于判断语句之中,用来检测一段字符串是否满足某一个格式.在日常生活中被广泛的用于各种用户输入信息的检测上. 而正则表达式实际上是一些具有特殊意义的字符序列.通过这些特殊字符构成的特殊序列 ...

  10. WC2017游记 & 能力残废康复计划

    懒癌晚期的蒟蒻一年多没有更Blog了… 这次冬眠营去绍一省好好地游玩了一番,体验了一段时间的豪华自助餐,成功吃胖… 第一课堂的东西基本还是没吸收…听着觉得有点道理,结果过几分钟就忘了…可能最大的收获就 ...