36会话界面的完成

来源:互联网 发布:淘宝免费货源怎么找 编辑:程序博客网 时间:2024/06/05 05:35

效果图:



首先看下会话界面实现的功能:

1.onCreateView方法加载布局

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_conversation_history,container, false);}

2.onActivityCreated方法首先做个判断,当用户被T后,没按下确定按键,但是按下了home按键,导致长期在后台运行app从而崩掉的BUG

if (savedInstanceState != null&& savedInstanceState.getBoolean("isConflict", false)) {return;}
然后得到输入法的管理服务和找到各个控件的id,并且设置listview的adapter:

inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);errorItem = (RelativeLayout) getView().findViewById(R.id.rl_error_item);errorText = (TextView) errorItem.findViewById(R.id.tv_connect_errormsg);conversationList = loadConversationWithRecentChat();listview = (ListView) getView().findViewById(R.id.list);adapter = new ChatAllHistoryAdapter(getActivity(), 1, conversationList);listview.setAdapter(adapter);

特别注意:                               

<span style="font-size:14px;">errorText = (TextView) errorItem.findViewById(R.id.tv_connect_errormsg);</span>

这个控件的得到id的方式。

然后便是ListView的条目的单击事件,根据是单聊还是群聊,传给ChatActivity不同的值:

listview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {EMConversation conversation = adapter.getItem(position);String username = conversation.getUserName();if (username.equals(IMApplication.getInstance().getUserName())) {Toast.makeText(getActivity(), "不能和自己聊天", 0).show();} else {Intent intent = new Intent(getActivity(),ChatActivity.class);EMContact emContact = null;groups = EMGroupManager.getInstance().getAllGroups();for (EMGroup group : groups) {if (group.getGroupId().equals(username)) {emContact = group;break;}}if (emContact != null && emContact instanceof EMGroup) {// 群聊intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP);intent.putExtra("groupId",((EMGroup) emContact).getGroupId());} else {// 单聊intent.putExtra("userId", username);}startActivity(intent);}}});
当然还有一条逻辑就是不能和自己聊天。

再然后就是ListView的上下文菜单:作用是删除聊天的条目并且更新界面:

// 注册上下文菜单registerForContextMenu(listview);

@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getActivity().getMenuInflater().inflate(R.menu.delete_message, menu);}@Overridepublic boolean onContextItemSelected(MenuItem item) {if (item.getItemId() == R.id.delete_message) {EMConversation tobeDeleteCons = adapter.getItem(((AdapterContextMenuInfo) item.getMenuInfo()).position);//删除此会话EMChatManager.getInstance().deleteConversation(tobeDeleteCons.getUserName(), tobeDeleteCons.isGroup());InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(getActivity());inviteMessgeDao.deleteMessage(tobeDeleteCons.getUserName());adapter.remove(tobeDeleteCons);adapter.notifyDataSetChanged();//更新未读的消息数(MainActivity的这个方法暂未实现2014-12-31)((MainActivity)getActivity()).updateUnreadLabel();}return super.onContextItemSelected(item);}
在ListView的触摸事件中,做的事情是隐藏软键盘:

listview.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 隐藏软键盘hideSoftKeyboard();return false;}});

void hideSoftKeyboard() {if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {if (getActivity().getCurrentFocus() != null) {inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);}}}
接着便是搜索框的处理:


// 搜索框query = (EditText) getView().findViewById(R.id.query);// 搜索框中清除按钮clearSearch = (ImageButton) getView().findViewById(R.id.search_clear);query.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {adapter.getFilter().filter(s);if (s.length() > 0) {clearSearch.setVisibility(View.VISIBLE);} else {clearSearch.setVisibility(View.INVISIBLE);}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {}});clearSearch.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {query.getText().clear();hideSoftKeyboard();}});

最后在onSaveInstanceState中保存状态:


完整的代码如下:

package com.dystu.impro.fragment;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Hashtable;import java.util.List;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.text.Editable;import android.text.TextWatcher;import android.view.ContextMenu;import android.view.LayoutInflater;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.view.WindowManager;import android.view.inputmethod.InputMethodManager;import android.widget.AdapterView;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.AdapterView.OnItemClickListener;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.dystu.impro.R;import com.dystu.impro.activity.ChatActivity;import com.dystu.impro.activity.MainActivity;import com.dystu.impro.adapter.ChatAllHistoryAdapter;import com.dystu.impro.app.IMApplication;import com.dystu.impro.db.dao.InviteMessgeDao;import com.easemob.chat.EMChatManager;import com.easemob.chat.EMContact;import com.easemob.chat.EMConversation;import com.easemob.chat.EMGroup;import com.easemob.chat.EMGroupManager;import com.easemob.chat.EMMessage;public class ChatAllHistoryFragment extends Fragment {private InputMethodManager inputMethodManager;private ListView listview;private ChatAllHistoryAdapter adapter;private EditText query;private ImageButton clearSearch;private RelativeLayout errorItem;private TextView errorText;private boolean hidden;private List<EMGroup> groups;private List<EMConversation> conversationList;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_conversation_history,container, false);}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);if (savedInstanceState != null&& savedInstanceState.getBoolean("isConflict", false)) {return;}inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);errorItem = (RelativeLayout) getView().findViewById(R.id.rl_error_item);errorText = (TextView) errorItem.findViewById(R.id.tv_connect_errormsg);conversationList = loadConversationWithRecentChat();listview = (ListView) getView().findViewById(R.id.list);adapter = new ChatAllHistoryAdapter(getActivity(), 1, conversationList);listview.setAdapter(adapter);groups = EMGroupManager.getInstance().getAllGroups();listview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {EMConversation conversation = adapter.getItem(position);String username = conversation.getUserName();if (username.equals(IMApplication.getInstance().getUserName())) {Toast.makeText(getActivity(), "不能和自己聊天", 0).show();} else {Intent intent = new Intent(getActivity(),ChatActivity.class);EMContact emContact = null;groups = EMGroupManager.getInstance().getAllGroups();for (EMGroup group : groups) {if (group.getGroupId().equals(username)) {emContact = group;break;}}if (emContact != null && emContact instanceof EMGroup) {// 群聊intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP);intent.putExtra("groupId",((EMGroup) emContact).getGroupId());} else {// 单聊intent.putExtra("userId", username);}startActivity(intent);}}});// 注册上下文菜单registerForContextMenu(listview);listview.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 隐藏软键盘hideSoftKeyboard();return false;}});// 搜索框query = (EditText) getView().findViewById(R.id.query);// 搜索框中清除按钮clearSearch = (ImageButton) getView().findViewById(R.id.search_clear);query.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {adapter.getFilter().filter(s);if (s.length() > 0) {clearSearch.setVisibility(View.VISIBLE);} else {clearSearch.setVisibility(View.INVISIBLE);}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {}});clearSearch.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {query.getText().clear();hideSoftKeyboard();}});}void hideSoftKeyboard() {if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {if (getActivity().getCurrentFocus() != null) {inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);}}}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getActivity().getMenuInflater().inflate(R.menu.delete_message, menu);}@Overridepublic boolean onContextItemSelected(MenuItem item) {if (item.getItemId() == R.id.delete_message) {EMConversation tobeDeleteCons = adapter.getItem(((AdapterContextMenuInfo) item.getMenuInfo()).position);//删除此会话EMChatManager.getInstance().deleteConversation(tobeDeleteCons.getUserName(), tobeDeleteCons.isGroup());InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(getActivity());inviteMessgeDao.deleteMessage(tobeDeleteCons.getUserName());adapter.remove(tobeDeleteCons);adapter.notifyDataSetChanged();//更新未读的消息数(MainActivity的这个方法暂未实现2014-12-31)((MainActivity)getActivity()).updateUnreadLabel();}return super.onContextItemSelected(item);}public void refresh() {conversationList.clear();conversationList.addAll(loadConversationWithRecentChat());adapter.notifyDataSetChanged();}/** *  * 获取所有的会话 *  *  * @return */private List<EMConversation> loadConversationWithRecentChat() {// 获取所有的会话,包括陌生人Hashtable<String, EMConversation> conversations = EMChatManager.getInstance().getAllConversations();List<EMConversation> list = new ArrayList<EMConversation>();// 过滤掉messages 中size为0的会话for (EMConversation conversation : conversations.values()) {if (conversation.getAllMessages().size() != 0) {list.add(conversation);}}// 排序sortConversationByLastChatTime(list);return list;}/** *  * 根据最后一条消息的时间排序 *  *  * @param conversationList */private void sortConversationByLastChatTime(List<EMConversation> conversationList) {Collections.sort(conversationList, new Comparator<EMConversation>() {@Overridepublic int compare(final EMConversation con1, EMConversation con2) {EMMessage con2LastMessage = con2.getLastMessage();EMMessage con1LastMessage = con1.getLastMessage();if (con2LastMessage.getMsgTime() == con1LastMessage.getMsgTime()) {return 0;} else if (con2LastMessage.getMsgTime() > con1LastMessage.getMsgTime()) {return 1;} else {return -1;}}});}@Overridepublic void onHiddenChanged(boolean hidden) {super.onHiddenChanged(hidden);this.hidden = hidden;if (!hidden) {refresh();}}  @Override    public void onResume() {        super.onResume();        if (!hidden && !((MainActivity) getActivity()).isConflict) {            refresh();        }    }    @Override    public void onSaveInstanceState(Bundle outState) {        if (((MainActivity) getActivity()).isConflict)            outState.putBoolean("isConflict", true);        super.onSaveInstanceState(outState);    }}


0 0
原创粉丝点击