Fragment 中 ListView绑定ContextMenu

Posted henanleon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
}
}





































































































































































































































































































以上是关于Fragment 中 ListView绑定ContextMenu的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 Fragment 更新一个 Fragment 的 ListView?

android fragment中有Listview,通过点击item跳转到另一个有ListView的fragment中

处理Fragment类ListView的按钮事件?

同样的代码,listview出现在activity中,但是listview没有出现在fragment中

Listview 项目未在 Fragment Android 中显示

如何在另一个 Fragment 中更新 ListView?