实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
package com.ty.winchat.ui; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Queue; import java.util.Set; import net.youmi.android.AdManager; import net.youmi.android.banner.AdSize; import net.youmi.android.banner.AdView; import net.youmi.android.spot.SpotManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.location.Location; import android.location.LocationManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.telephony.TelephonyManager; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.ty.winchat.R; import com.ty.winchat.WinChatApplication; import com.ty.winchat.listener.Listener; import com.ty.winchat.listener.TCPFileListener; import com.ty.winchat.listener.inter.IconReceived; import com.ty.winchat.model.UDPMessage; import com.ty.winchat.model.User; import com.ty.winchat.service.ChatService; import com.ty.winchat.service.ChatService.MyBinder; import com.ty.winchat.util.Constant; import com.ty.winchat.util.LocalMemoryCache; import com.ty.winchat.util.Util; import com.ty.winchat.widget.PullToRefreshExpandableListView; import com.ty.winchat.widget.PullToRefreshExpandableListView.OnRefreshListener; public class Main extends Base implements IconReceived{ private PullToRefreshExpandableListView listView; private List<User> users=new ArrayList<User>(); private Map<String, Queue<UDPMessage>> messages; MyServiceConnection connection; public static MyBinder binder; private boolean binded; private MyAdapter adapter; private UserBroadcastReceiver receiver=new UserBroadcastReceiver(); private Map<String, Message> iconMap=new HashMap<String, Message>(); public static final String ACTION_ADD_USER="com.ty.winchat.adduser"; private TCPFileListener fileListener; private Handler handler=new Handler(){ public void handleMessage(Message msg) { try { //刷新头像 ((ImageView)msg.obj).setImageBitmap(Util.getRoundedCornerBitmap(LocalMemoryCache.getInstance().get(msg.getData().getString("key")))); } catch (Exception e) { e.printStackTrace(); } }; }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); fileListener=TCPFileListener.getInstance(); if(!fileListener.isRunning()) { try { fileListener.open(); fileListener.setIconReceived(this); } catch (IOException e) { e.printStackTrace(); } } // 加载插播资源 SpotManager.getInstance(this).loadSpotAds(); my(); } private void my(){ } @Override protected void onStart() { super.onStart(); // SpotManager.getInstance(this).showSpotAds(this); // SpotManager.getInstance(this).getSpotDialog(); listView.setAdapter(adapter=new MyAdapter()); adapter.notifyDataSetChanged(); if(fileListener!=null) fileListener.setOnProgressUpdate(null); } /** * 做一些初始化的动作 */ private void init(){ Intent intent=new Intent(Main.this,ChatService.class); startService(intent); bindService(intent, connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE); IntentFilter filter=new IntentFilter(ACTION_ADD_USER); registerReceiver(receiver, filter); listView=(PullToRefreshExpandableListView) findViewById(R.id.main_listview); TextView view=(TextView) findViewById(R.id.toptextView); Button set=(Button) findViewById(R.id.right_btn); view.setText("Wifi-Chat"); set.setText("设置"); set.setVisibility(View.VISIBLE); set.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Main.this,com.ty.winchat.ui.Set.class)); } }); listView.setGroupIndicator(getResources().getDrawable(R.drawable.listview_open_selector)); listView.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { if(binded){ unbindService(connection); binded=false; } Intent intent=new Intent(Main.this,MessageChat.class ); switch (groupPosition) { case 0: String ip=WinChatApplication.mainInstance.getLocalIp(); if(ip==null){ showToast("请检测wifi"); return false; } intent.putExtra("IP",ip); intent.putExtra("DeviceCode", WinChatApplication.mainInstance.getDeviceCode()); intent.putExtra("name", WinChatApplication.mainInstance.getMyName()); break; case 1: User user=users.get(childPosition); intent.putExtra("IP",user .getIp()); intent.putExtra("DeviceCode", user.getDeviceCode()); intent.putExtra("name", user.getUserName()); break; case 2: intent=new Intent(Main.this,RoomChat.class ); } startActivity(intent);//跳转到个人聊天界面 return false; } }); listView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new AsyncTask<Void, Void, Void>() { protected Void doInBackground(Void... params) { try { if(binder!=null) binder.noticeOnline(); Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { listView.onRefreshComplete(); } }.execute(); } }); initad(); } /** * 初始化广告 */ private void initad(){ AdManager.getInstance(this).init(Constant.id,Constant.key, false); LinearLayout adLayout = (LinearLayout) findViewById(R.id.adLayout); AdView adView = new AdView(this, AdSize.SIZE_320x50); adLayout.addView(adView); } long oldTime; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ long currentTime=System.currentTimeMillis(); if(currentTime-oldTime<3*1000){ finish(); }else{ showToast("再按一次退出"); oldTime=currentTime; } } return true; } @Override protected void onDestroy() { super.onDestroy(); if(binded) unbindService(connection); stopService(new Intent(Main.this,ChatService.class)); unregisterReceiver(receiver); if(fileListener!=null) try { fileListener.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 用来通知刷新列表 */ class UserBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(binder!=null){ users.clear(); Set<Entry<String,User>> set=binder.getUsers().entrySet(); for(Entry<String,User> entry:set) users.add(entry.getValue()); if(adapter==null) { adapter=new MyAdapter(); listView.setAdapter(adapter); } adapter.notifyDataSetChanged(); }else { unbindService(connection); binded=false; bindService(new Intent(Main.this,ChatService.class), connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE); } } } public class MyServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { binder=(MyBinder) service; messages=binder.getMessages(); binded=true; } @Override public void onServiceDisconnected(ComponentName name) { } } class MyAdapter extends BaseExpandableListAdapter{ String[] group={"自己","在线","聊天室"}; @Override public Object getChild(int arg0, int arg1) { return null; } @Override public long getChildId(int groupPosition, int childPosition) { return 0; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ holder=new ViewHolder(); convertView=getLayoutInflater().inflate(R.layout.main_listview_child_item, null); holder.userName=(TextView) convertView.findViewById(R.id.main_listview_child_item_name); holder.ip=(TextView) convertView.findViewById(R.id.main_listview_child_item_ip); holder.msgNum=(TextView) convertView.findViewById(R.id.main_listview_child_item_msg_num); holder.icon=(ImageView) convertView.findViewById(R.id.main_listview_child_item_icon); convertView.setTag(holder); }else { holder=(ViewHolder) convertView.getTag(); } switch (groupPosition) { case 0://自己 holder.userName.setText(WinChatApplication.mainInstance.getMyName()); holder.ip.setText(WinChatApplication.mainInstance.getLocalIp()); holder.msgNum.setVisibility(View.INVISIBLE); Bitmap bitmap=LocalMemoryCache.getInstance().get(com.ty.winchat.ui.Set.iconName); if(bitmap==null){ bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath com.ty.winchat.ui.Set.iconName); if(bitmap!=null){ holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap)); LocalMemoryCache.getInstance().put(com.ty.winchat.ui.Set.iconName, bitmap); }else { holder.icon.setImageResource(R.drawable.ic_launcher); } }else{ holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap)); } break; case 1://在线 User user=users.get(childPosition); holder.userName.setText(user.getUserName()); holder.ip.setText(user.getIp()); Queue<UDPMessage> msgs=messages.get(user.getIp()); if(msgs!=null&&msgs.size()>0){ holder.msgNum.setVisibility(View.VISIBLE); holder.msgNum.setText(msgs.size() ""); }else { holder.msgNum.setVisibility(View.INVISIBLE); } Bitmap bitmap1=LocalMemoryCache.getInstance().get(user.getDeviceCode());//用设备id来标识唯一头像 if(bitmap1==null){//内存中没有 bitmap1=BitmapFactory.decodeFile(WinChatApplication.iconPath user.getDeviceCode());//从硬盘上获取 if(bitmap1!=null){ holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1)); LocalMemoryCache.getInstance().put(user.getDeviceCode(), bitmap1);//放进缓存 if(!user.isRefreshIcon()){//第一次展示则再次请求刷新 reFreashIcon(user, holder.icon); } }else {//磁盘也没有,则发送消息获取 holder.icon.setImageResource(R.drawable.ic_launcher); reFreashIcon(user, holder.icon); } }else { holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1)); if(!user.isRefreshIcon()){//第一次展示则再次请求刷新 reFreashIcon(user, holder.icon); } } break; case 2://聊天室 Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.all_people_icon); holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap2)); holder.userName.setText("所有"); holder.ip.setText("接收所有在线人消息"); msgs=messages.get(Constant.ALL_ADDRESS); if(msgs!=null&&msgs.size()>0){ holder.msgNum.setVisibility(View.VISIBLE); holder.msgNum.setText(msgs.size() ""); }else { holder.msgNum.setVisibility(View.INVISIBLE); } break; } return convertView; } /** * 请求图片 * @param user * @param view */ private void reFreashIcon(User user,ImageView view){ if(binder!=null) try { UDPMessage message=WinChatApplication.mainInstance.getMyUdpMessage("", Listener.REQUIRE_ICON); binder.sendMsg(message, InetAddress.getByName(user.getIp())); Message msg=handler.obtainMessage(); msg.obj=view; iconMap.put(user.getDeviceCode(), msg);//记录当前位置的ImageView对象 user.setRefreshIcon(true); } catch (UnknownHostException e) { e.printStackTrace(); } } @Override public int getChildrenCount(int groupPosition) { switch (groupPosition) { case 0: return 1; case 1: return users.size(); case 2: return 1; } return 0; } @Override public Object getGroup(int groupPosition) { return null; } @Override public int getGroupCount() { return group.length; } @Override public long getGroupId(int groupPosition) { return 0; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ holder=new ViewHolder(); convertView=getLayoutInflater().inflate(R.layout.main_listview_group_item, null); holder.userName=(TextView) convertView.findViewById(R.id.txt); holder.ip=(TextView) convertView.findViewById(R.id.num); convertView.setTag(holder); }else { holder=(ViewHolder) convertView.getTag(); } holder.userName.setText(group[groupPosition]); if(groupPosition==0){ holder.ip.setText("[1]"); }else if(groupPosition==1){ holder.ip.setText("[" users.size() "]"); }else if(groupPosition==2){ holder.ip.setText("[1]"); } return convertView; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } class ViewHolder{ TextView userName; TextView ip; TextView msgNum; ImageView icon; } @Override public void iconReceived(String fileName) { Message msg=iconMap.get(fileName); if(msg!=null){ Bitmap bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath fileName); if(bitmap!=null){ LocalMemoryCache.getInstance().put(fileName, bitmap); Bundle bundle=new Bundle(); bundle.putString("key", fileName); msg.setData(bundle); handler.sendMessage(msg); } } } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)