/* * 官网地站:http://www.mob.com * 技术支持QQ: 4006852216 * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) * * Copyright (c) 2013年 mob.com. All rights reserved. */ package cn.sharesdk.onekeyshare.themes.classic; import java.util.ArrayList; import java.util.HashMap; import android.graphics.drawable.ColorDrawable; import android.os.Handler.Callback; import android.os.Message; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView.OnItemClickListener; import cn.sharesdk.framework.Platform; import cn.sharesdk.framework.PlatformActionListener; import com.mob.tools.gui.PullToRefreshListAdapter; import com.mob.tools.gui.PullToRefreshView; import com.mob.tools.utils.UIHandler; /** 好友列表的适配器 */ public class FriendAdapter extends PullToRefreshListAdapter implements PlatformActionListener { private FriendListPage activity; private boolean hasNext; private Platform platform; /** 请求好友列表时,每页15个 */ private final int pageCount = 15; /** 当前的好友列表是第几页 */ private int curPage; /** 好友列表数据 */ private ArrayList<Following> follows; /** 判断当前的好友列表数据与请求的新数据是否有重复 */ private HashMap<String, Boolean> map; /** 好友列表的头部View */ private PRTHeader llHeader; /** 根据设计,按照比例来布局,以此来适配所有手机 */ private float ratio; public FriendAdapter(FriendListPage activity, PullToRefreshView view) { super(view); this.activity = activity; curPage = -1; hasNext = true; map = new HashMap<String, Boolean>(); follows = new ArrayList<Following>(); getListView().setDivider(new ColorDrawable(0xffeaeaea)); } public void setRatio(float ratio) { this.ratio = ratio; getListView().setDividerHeight((int) (ratio < 1 ? 1 : ratio)); } public void setOnItemClickListener(OnItemClickListener listener) { getListView().setOnItemClickListener(listener); } public void setPlatform(Platform platform) { this.platform = platform; platform.setPlatformActionListener(this); } private void next() { if (hasNext) { platform.listFriend(pageCount, curPage + 1, null); } } public void onComplete(Platform plat, int action, HashMap<String, Object> res) { final FollowersResult followersResult = parseFollowers(platform.getName(), res, map); if (followersResult == null) { UIHandler.sendEmptyMessage(0, new Callback() { public boolean handleMessage(Message msg) { notifyDataSetChanged(); return false; } }); return; } hasNext = followersResult.hasNextPage; if (followersResult.list != null && followersResult.list.size() > 0) { curPage++; Message msg = new Message(); msg.what = 1; msg.obj = followersResult.list; UIHandler.sendMessage(msg, new Callback() { public boolean handleMessage(Message msg) { if (curPage <= 0) { follows.clear(); } follows.addAll(followersResult.list); notifyDataSetChanged(); return false; } }); } } private FollowersResult parseFollowers(String platform, HashMap<String, Object> res, HashMap<String, Boolean> uidMap) { if (res == null || res.size() <= 0) { return null; } boolean hasNext = false; ArrayList<Following> data = new ArrayList<Following>(); if ("SinaWeibo".equals(platform)) { // users[id, name, description] @SuppressWarnings("unchecked") ArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get("users"); for (HashMap<String, Object> user : users) { String uid = String.valueOf(user.get("id")); if (!uidMap.containsKey(uid)) { Following following = new Following(); following.uid = uid; following.screenName = String.valueOf(user.get("name")); following.description = String.valueOf(user.get("description")); following.icon = String.valueOf(user.get("profile_image_url")); following.atName = following.screenName; uidMap.put(following.uid, true); data.add(following); } } hasNext = (Integer) res.get("total_number") > uidMap.size(); } else if ("TencentWeibo".equals(platform)) { hasNext = ((Integer)res.get("hasnext") == 0); // info[nick, name, tweet[text]] @SuppressWarnings("unchecked") ArrayList<HashMap<String, Object>> infos = (ArrayList<HashMap<String,Object>>) res.get("info"); for (HashMap<String, Object> info : infos) { String uid = String.valueOf(info.get("name")); if (!uidMap.containsKey(uid)) { Following following = new Following(); following.screenName = String.valueOf(info.get("nick")); following.uid = uid; following.atName = uid; @SuppressWarnings("unchecked") ArrayList<HashMap<String, Object>> tweets = (ArrayList<HashMap<String,Object>>) info.get("tweet"); for (HashMap<String, Object> tweet : tweets) { following.description = String.valueOf(tweet.get("text")); break; } following.icon = String.valueOf(info.get("head")) + "/100"; uidMap.put(following.uid, true); data.add(following); } } } else if ("Facebook".equals(platform)) { // data[id, name] @SuppressWarnings("unchecked") ArrayList<HashMap<String, Object>> datas = (ArrayList<HashMap<String,Object>>) res.get("data"); for (HashMap<String, Object> d : datas) { String uid = String.valueOf(d.get("id")); if (!uidMap.containsKey(uid)) { Following following = new Following(); following.uid = uid; following.atName = "["+uid+"]"; following.screenName = String.valueOf(d.get("name")); @SuppressWarnings("unchecked") HashMap<String, Object> picture = (HashMap<String, Object>) d.get("picture"); if (picture != null) { @SuppressWarnings("unchecked") HashMap<String, Object> pData = (HashMap<String, Object>) picture.get("data"); following.icon = String.valueOf(pData.get("url")); } uidMap.put(following.uid, true); data.add(following); } } @SuppressWarnings("unchecked") HashMap<String, Object> paging = (HashMap<String, Object>) res.get("paging"); hasNext = paging.containsKey("next"); } else if ("Twitter".equals(platform)) { // users[screen_name, name, description] @SuppressWarnings("unchecked") ArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get("users"); for (HashMap<String, Object> user : users) { String uid = String.valueOf(user.get("screen_name")); if (!uidMap.containsKey(uid)) { Following following = new Following(); following.uid = uid; following.atName = uid; following.screenName = String.valueOf(user.get("name")); following.description = String.valueOf(user.get("description")); following.icon = String.valueOf(user.get("profile_image_url")); uidMap.put(following.uid, true); data.add(following); } } } FollowersResult ret = new FollowersResult(); ret.list = data; ret.hasNextPage = hasNext; return ret; } public void onError(Platform plat, int action, Throwable t) { t.printStackTrace(); } public void onCancel(Platform plat, int action) { UIHandler.sendEmptyMessage(0, new Callback() { public boolean handleMessage(Message msg) { activity.finish(); return false; } }); } public Following getItem(int position) { return follows.get(position); } public long getItemId(int position) { return position; } public int getCount() { return follows == null ? 0 : follows.size(); } public View getHeaderView() { if (llHeader == null) { llHeader = new PRTHeader(getContext()); } return llHeader; } public void onPullDown(int percent) { llHeader.onPullDown(percent); } public void onRequest() { llHeader.onRequest(); curPage = -1; hasNext = true; map.clear(); next(); } public void onReversed() { llHeader.reverse(); } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { FriendListItem llItem = new FriendListItem(parent.getContext(), ratio); convertView = llItem; } FriendListItem llItem = (FriendListItem) convertView; llItem.update(getItem(position), isFling()); if (position == getCount() - 1) { next(); } return convertView; } public static class Following { public boolean checked; public String screenName; public String description; public String uid; public String icon; //@Name 用于微博等提示或关联某个人 public String atName; } private static class FollowersResult { public ArrayList<Following> list; public boolean hasNextPage = false; } }