Fragment 中 ListView绑定ContextMenu

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();    }}

原文地址:https://www.cnblogs.com/henanleon/p/9942980.html

时间: 2024-08-01 10:24:16

Fragment 中 ListView绑定ContextMenu的相关文章

Android Fragment中ListView的OnItemClickListener无效

人可能会变,但代码不一样,一个地方出错说不执行就是不执行. 网上说是ListView的 OnItemClick监听失效的原因.还有网上给出的解决方案是把加载ListView数据的每一项都加上 android:focusable="false" 然后一切问题就OK 了. 因为点击的焦点被ListView列表里的其他控件给获取了,所以就出现未反应情况.

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

修改fragment的布局 同上一篇:在Activity中的使用中一样,在Fragment中使用Data Binding同样需要修改布局,修改方式也跟Activity一样,在最外层加上<layout>标签: <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"

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

首先介绍一下这个程序的功能: 1.顶部有两个可以切换Fragment的Button 2.在其中一个Fragment中里有个ScrollView,ScrollView中有ViewFlipper,ListView.(另一个Fragment中就随意了) 随着listView的滚动,ViewFlipper中的内容也会滚动. 3.两个布局(主布局,一个Fragment的布局(另一个没写,其实都一样)),一个Fragment,一个主Activity,重写ListView(不重写的话,不会随着ViewFlip

使用listview绑定sqlite中的数据

我想在我的安卓项目中实现一个这样的功能,读取sqlite数据库中的数据并显示到某个页面的listview控件中. 首先,我建立了一个Service类,来实现对数据库的各种操作,然后在这个类中添加对数据库操作的增删改查方法.具体代码如下: import java.util.ArrayList;import java.util.HashMap;import java.util.List; import android.content.ContentValues;import android.cont

WPF ContextMenu 在MVVM模式中无法绑定 Command的解决办法

ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Binding}”是行不通的 不能绑父级,但是能绑资源 第一步:定义一个中间类用来做资源对象 1 public class BindingProxy : Freezable 2 { 3 #region Overrides of Freezable 4 5 protected override Freezable CreateI

Fragment中如何获取listview

============问题描述============ 我的FileFragment继承了Fragment,现在我想要在FileFragment中获取获取file.xml中的一个listview,我用了下面两种方式: //fileListView=(ListView)getActivity().findViewById(R.id.file_list);得到空指针 fileListView=(ListView)inflater.inflate(R.id.file_list, null);找不到资

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

public class LeftFragment extends Fragment{ private ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.lesson_table_left, null); listV

Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能

Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义adapter的使用方法.加了非常多的推断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,另一个listview的item.xml.相信不用多说 activity_main.xml <LinearLayout xmlns:

C#winform中ListView的使用

使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览.重命名.删除及查询等功能,主要功能界面展示如下: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System