Android仿人人客户端(v5.7.1)——个人主页(二)
16lz
2022-04-26
转载请标明出处: http://blog.csdn.net/android_ls/article/details/9276037 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。
这一篇基于Android仿人人客户端(v5.7.1)——个人主页(一),在上一篇的基础上继续完善。先看下之前完成的新鲜事界面效果图,这篇要聊的是在之前的新鲜事主界面,点击好友图像进入好友个人主页的进一步实现,下面我们就一步一的进行完善好友个人主页的功能。
一、实现好友的个人主页,对新鲜事的过滤处理。
1、为顶部下拉菜单准备数据
a. 在strings.xml文件中,添加字符串数组:
<string-array name="personal_homepage_filter_list"> <item>最近来访</item> <item>新鲜事</item> <item>资料</item> <item>相册</item> <item>状态</item> <item>日志</item> <item>分享</item> </string-array>b.准备相应的Item图标,代码如下:
/** * 顶部下拉列表的操作指示图标Id数组 */ private int[] mIcons = { R.drawable.v5_0_1_profile_popupwindow_type_visitor_background, R.drawable.v5_0_1_profile_popupwindow_type_minifeed_background, R.drawable.v5_0_1_profile_popupwindow_type_info_background, R.drawable.v5_0_1_profile_popupwindow_type_album_background, R.drawable.v5_0_1_profile_popupwindow_type_status_background, R.drawable.v5_0_1_profile_popupwindow_type_blog_background, R.drawable.v5_0_1_profile_popupwindow_type_share_background};2、初始化顶部下拉菜单,代码如下:
View view = mInflater.inflate(R.layout.fresh_news_popupwindow, null); mPopupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, true); mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); mPopupWindow.setAnimationStyle(R.style.fresh_news_popup_animation); mPopupListView = (ListView) view.findViewById(R.id.popup_listview); mTexts = this.getResources().getStringArray(R.array.personal_homepage_filter_list); mPopupAdapter = new FreshNewsPopupAdapter(this, mIcons, mTexts); mPopupListView.setAdapter(mPopupAdapter);3、运行效果图如下:
4、添加顶部下拉菜单的Item事件处理,实现对新鲜事类型的过滤。
// 设置顶部下拉菜单的Item事件处理 mPopupListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mPopupWindow.dismiss(); // 当前选择的项与之前的一样,则不做处理。 if (mPopupAdapter.getPosition() == position) { return; } // 新鲜事过滤事件处理 fresh_news_type = freshNewsTypes[position]; LogUtil.i(TAG, "onItemClick position = " + position); LogUtil.i(TAG, "onItemClick fresh_news_type = " + fresh_news_type); mPopupAdapter.setPosition(position); mPopupAdapter.notifyDataSetChanged(); topMenuNavbar.tvTitle.setText(mTexts[position]); if(PERSONAL_HOMEPAGE_TYPE_LATELY.equals(fresh_news_type)) { // 最近来访 } else if(PERSONAL_HOMEPAGE_TYPE_DATA.equals(fresh_news_type)) { // 资料 } else { page = 1; mFreshNewsList.clear(); getFreshNews(); } } });新鲜事的类型分为以下几种,代码如下:
/** * 发表的新鲜事,默认请求所有类型的新鲜事 */ private static final String FRESH_NEWS_TYPE_ALL = "10,11,20,21,22,23,30,31,32,33,34,35,36"; /** * 照片(相册) */ private static final String FRESH_NEWS_TYPE_PHOTO = "30,31"; /** * 状态 */ private static final String FRESH_NEWS_TYPE_STATUS = "10,11"; /** * 日志 */ private static final String FRESH_NEWS_TYPE_BLOG = "20,22"; /** * 分享的新鲜事 */ private static final String FRESH_NEWS_TYPE_SHARE = "21,23,32,33,36"; /** * 最近来访 */ private static final String PERSONAL_HOMEPAGE_TYPE_LATELY = "1"; /** * 资料 */ private static final String PERSONAL_HOMEPAGE_TYPE_DATA = "2"; /** * 新鲜事类型数组 */ private String[] freshNewsTypes = { PERSONAL_HOMEPAGE_TYPE_LATELY, FRESH_NEWS_TYPE_ALL, PERSONAL_HOMEPAGE_TYPE_DATA, FRESH_NEWS_TYPE_PHOTO, FRESH_NEWS_TYPE_STATUS, FRESH_NEWS_TYPE_BLOG, FRESH_NEWS_TYPE_SHARE}; /** * 新鲜事类型,默认为当前所支持的全部类型 */ private String fresh_news_type = FRESH_NEWS_TYPE_ALL;运行效果图如下:
好友个人主页(新鲜事)
好友个人主页(状态)
好友个人主页(相册)
好友个人主页(分享)
好友个人主页(日志)
二、实现好友的个人主页资料信息的获取和展示
1、配置用于显示资料信息UI布局文件(personal_homepage_user_basic.xml),代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#FFFFFF" android:orientation="vertical" > <RelativeLayout android:id="@+id/rl_friends" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/fresh_news_list_item_selector"> <TextView android:id="@+id/tv_friends_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#ff005092" android:textSize="16sp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="8dip" android:src="@drawable/v5_0_1_profile_to_friend_list_img" /> <View android:layout_width="fill_parent" android:layout_height="1dip" android:layout_below="@+id/tv_friends_count" android:background="@drawable/v5_0_1_profile_header_divider" /> </RelativeLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="15dip" android:paddingTop="10dp" android:text="基本信息" android:textColor="#FF333333" android:textSize="13sp" /> <View android:layout_width="fill_parent" android:layout_height="1.5dip" android:background="@drawable/v5_0_1_profile_header_divider" /> <TextView android:id="@+id/tv_renren_id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#80333333" android:textSize="16sp" /> <View android:layout_width="fill_parent" android:layout_height="1dip" android:background="@drawable/v5_0_1_profile_header_divider" /> <TextView android:id="@+id/tv_gender" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#80333333" android:textSize="16sp" /> <View android:layout_width="fill_parent" android:layout_height="1dip" android:background="@drawable/v5_0_1_profile_header_divider" /> <TextView android:id="@+id/tv_birth" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#80333333" android:textSize="16sp" /> <View android:layout_width="fill_parent" android:layout_height="1dip" android:background="@drawable/v5_0_1_profile_header_divider" /> <TextView android:id="@+id/tv_hometown" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#80333333" android:textSize="16sp" /> <View android:layout_width="fill_parent" android:layout_height="1dip" android:background="@drawable/v5_0_1_profile_header_divider" /> <TextView android:id="@+id/tv_network" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dip" android:paddingLeft="20dip" android:paddingTop="10dp" android:textColor="#80333333" android:textSize="16sp" /></LinearLayout>2、将的基本信息资料显示组件,添加到ListVew的 FooterView。代码如下:
mBasicInfoView = (LinearLayout) mInflater.inflate(R.layout.personal_homepage_user_basic, null); mBasicInfoView.setVisibility(View.GONE); mListView.addFooterView(mBasicInfoView);3、获取 基本信息资料显示的各个组件,代码如下:
tvRenrenId = (TextView) mBasicInfoView.findViewById(R.id.tv_renren_id); tvGender = (TextView) mBasicInfoView.findViewById(R.id.tv_gender); tvBirth = (TextView) mBasicInfoView.findViewById(R.id.tv_birth); tvHometown = (TextView) mBasicInfoView.findViewById(R.id.tv_hometown); tvNetwork = (TextView) mBasicInfoView.findViewById(R.id.tv_network);4、修改 获取用户个人主页信息的网络请求方法,代码如下:
/** * 获取用户个人主页的信息 */ public void getProfileInfo() { String accessToken = mAuthTokenManager.getAccessToken(); LogUtil.e(TAG, "accessToken = " + accessToken); Map<String, String> parameter = new HashMap<String, String>(); parameter.put("v", "1.0"); // API的版本号,固定值为1.0 parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。 parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML parameter.put("call_id", "1.0"); // 请求队列号 parameter.put("method", "users.getProfileInfo"); parameter.put("uid", uid + ""); // 个人主页用户的Id parameter.put("fields", "base_info,status,friends_count"); // 需要获取的信息的字段列表,各个字段用逗号隔开。 AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() { @Override public Object parse(String json) throws JSONException { LogUtil.i(TAG, "json = " + json); final JSONObject jsonObject = new JSONObject(json); mHandler.post(new Runnable() { @Override public void run() { String name = jsonObject.optString("name"); LogUtil.i(TAG, "name = " + name); String headurl = jsonObject.optString("headurl"); LogUtil.i(TAG, "headurl = " + headurl); int star = jsonObject.optInt("star"); LogUtil.i(TAG, "star = " + star); JSONObject jsonStatus = jsonObject.optJSONObject("status"); String status = jsonStatus.optString("content"); LogUtil.i(TAG, "status = " + status); tvName.setText(name); tvStatusContent.setText(status); if (star == 1) { ivStar.setVisibility(View.VISIBLE); } // 加载用户图像 /*ImageInfo imgInfo = new ImageInfo(ivIconView, headurl); new ImageLoader(PersonalHomepageActivity.this).displayImage(imgInfo);*/ int friends_count = jsonObject.optInt("friends_count"); LogUtil.i(TAG, "friends_count = " + friends_count); tvFriendsCount.setText(friends_count + "个好友"); int uid = jsonObject.optInt("uid"); LogUtil.i(TAG, "uid = " + uid); String network_name = jsonObject.optString("network_name"); LogUtil.i(TAG, "network_name = " + network_name); JSONObject jsonBaseInfo = jsonObject.optJSONObject("base_info"); JSONObject jsonBirth = jsonBaseInfo.optJSONObject("birth"); JSONObject jsonHometown = jsonBaseInfo.optJSONObject("hometown"); int gender = jsonBaseInfo.optInt("gender"); LogUtil.i(TAG, "gender = " + gender); String birth_month = jsonBirth.optString("birth_month"); LogUtil.i(TAG, "birth_month = " + birth_month); String birth_day = jsonBirth.optString("birth_day"); LogUtil.i(TAG, "birth_day = " + birth_day); String birth_year = jsonBirth.optString("birth_year"); LogUtil.i(TAG, "birth_year = " + birth_year); String province = jsonHometown.optString("province"); LogUtil.i(TAG, "province = " + province); String city = jsonHometown.optString("city"); LogUtil.i(TAG, "city = " + city); String sexString = "男"; if(gender == 0){ sexString = "女"; } tvRenrenId.setText("人人ID:" + uid); tvGender.setText("性别:" + sexString); tvBirth.setText("生日:" + birth_year + "年" + birth_month + "月" + birth_day + "日"); tvHometown.setText("家乡:" + province + " " + city); tvNetwork.setText("网络:" + network_name); } }); return null; } }, new ResultCallback() { @Override public void onSuccess(final Object obj) { /* { "uid":221659942, "status":{"content":"我才知道草莓翻转,是这个意思(偷笑) 转自谭静:明天最后一门考试,结束后,就真的迎来暑假啦~~哇卡卡卡~~~下学期也终于木有课了~~~(twg)(大笑)(ys)(流口水)","time":"2013-07-02 14:37:01"}, "star":1, "network_name":"西北大学", "headurl":"http://hdn.xnimg.cn/photos/hdn421/20130614/1350/tiny_cm9Q_ec73000461fa113e.jpg", "name":"谭静", "base_info":{"birth":{"birth_month":3,"birth_day":21,"birth_year":"1987"},"hometown":{"province":"河北","city":"唐山市"},"gender":0} }*/ } @Override public void onFail(int errorCode) { LogUtil.i(TAG, "freshNewsList errorCode = " + errorCode); } }); mDefaultThreadPool.execute(asyncHttpsPost); mAsyncRequests.add(asyncHttpsPost); }5、在顶部下拉菜单Item点击事件处理器( public void onItemClick(AdapterView<?> parent, View view, int position, long id) { })中,添加相应的处理。代码如下:
else if(PERSONAL_HOMEPAGE_TYPE_DATA.equals(fresh_news_type)) { // 资料 tvType.setText("好友信息"); mBasicInfoView.setVisibility(View.VISIBLE); page = 1; mFreshNewsList.clear(); mListView.setPullLoadEnable(false); mListView.setPullRefreshEnable(false); mFreshNewsAdapter.notifyDataSetChanged(); } else { mBasicInfoView.setVisibility(View.GONE); page = 1; mFreshNewsList.clear(); getFreshNews(); }6、运行效果图如下:
三、个人(好友)主页界面到目前为止,完整的代码如下:
package com.everyone.android.ui;import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.LinkedList;import java.util.Map;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.text.TextUtils;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.FrameLayout.LayoutParams;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.PopupWindow;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.everyone.android.R;import com.everyone.android.api.NetworkBaseActivity;import com.everyone.android.bitmap.ImageLoader;import com.everyone.android.callback.ParseCallback;import com.everyone.android.callback.ResultCallback;import com.everyone.android.entity.FreshNews;import com.everyone.android.entity.ImageInfo;import com.everyone.android.net.AsyncBaseRequest;import com.everyone.android.net.AsyncHttpsPost;import com.everyone.android.ui.freshnews.FreshNewsAdapter;import com.everyone.android.ui.freshnews.FreshNewsPopupAdapter;import com.everyone.android.utils.Constant;import com.everyone.android.utils.LogUtil;import com.everyone.android.widget.TopMenuNavbar;import com.everyone.android.widget.XListView;import com.everyone.android.widget.XListView.IXListViewListener;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;/** * 功能描述:个人主页(当前登录用户的个人主页或者好友的个人主页) * @author android_ls */public class PersonalHomepageActivity extends NetworkBaseActivity implements IXListViewListener, OnClickListener { /** * LOG打印标签 */ private static final String TAG = PersonalHomepageActivity.class.getSimpleName(); private TopMenuNavbar topMenuNavbar; private XListView mListView; private FreshNewsAdapter mFreshNewsAdapter; /** * 新鲜事信息集合 */ private LinkedList<FreshNews> mFreshNewsList = new LinkedList<FreshNews>(); /** * 用户信息唯一标识 */ private int uid; /** * 每一页记录数,默认值为30,最大50 */ private int pageCount = 30; /** * 当前获取第几页,默认值为1 */ private int page = 1; private LayoutInflater mInflater; // 用户图像 private ImageView ivIconView; // 用户名 private TextView tvName; // 表示该用户是否为星级用户 1表示该用户是星级用户,0表示否 private ImageView ivStar; // 用户状态信息 private TextView tvStatusContent; // 是否为VIP用户 private Button btnVip; /** * 显示当前过滤的信息所属的类型 */ private TextView tvType; /** * 指定信息类型的总数 */ private TextView tvTypeCount; /** * 发表的新鲜事,默认请求所有类型的新鲜事 */ private static final String FRESH_NEWS_TYPE_ALL = "10,11,20,21,22,23,30,31,32,33,34,35,36"; /** * 照片(相册) */ private static final String FRESH_NEWS_TYPE_PHOTO = "30,31"; /** * 状态 */ private static final String FRESH_NEWS_TYPE_STATUS = "10,11"; /** * 日志 */ private static final String FRESH_NEWS_TYPE_BLOG = "20,22"; /** * 分享的新鲜事 */ private static final String FRESH_NEWS_TYPE_SHARE = "21,23,32,33,36"; /** * 最近来访 */ private static final String PERSONAL_HOMEPAGE_TYPE_LATELY = "1"; /** * 资料 */ private static final String PERSONAL_HOMEPAGE_TYPE_DATA = "2"; /** * 新鲜事类型数组 */ private String[] freshNewsTypes = { PERSONAL_HOMEPAGE_TYPE_LATELY, FRESH_NEWS_TYPE_ALL, PERSONAL_HOMEPAGE_TYPE_DATA, FRESH_NEWS_TYPE_PHOTO, FRESH_NEWS_TYPE_STATUS, FRESH_NEWS_TYPE_BLOG, FRESH_NEWS_TYPE_SHARE}; /** * 新鲜事类型,默认为当前所支持的全部类型 */ private String fresh_news_type = FRESH_NEWS_TYPE_ALL; private PopupWindow mPopupWindow; /** * 顶部下拉列表 */ private ListView mPopupListView; /** * 顶部下拉列表数据适配器 */ private FreshNewsPopupAdapter mPopupAdapter; /** * 顶部下拉列表的操作提示文本数组 */ private String[] mTexts; /** * 顶部下拉列表的操作指示图标Id数组 */ private int[] mIcons = { R.drawable.v5_0_1_profile_popupwindow_type_visitor_background, R.drawable.v5_0_1_profile_popupwindow_type_minifeed_background, R.drawable.v5_0_1_profile_popupwindow_type_info_background, R.drawable.v5_0_1_profile_popupwindow_type_album_background, R.drawable.v5_0_1_profile_popupwindow_type_status_background, R.drawable.v5_0_1_profile_popupwindow_type_blog_background, R.drawable.v5_0_1_profile_popupwindow_type_share_background}; private LinearLayout mBasicInfoView; private TextView tvRenrenId; private TextView tvGender; private TextView tvBirth; private TextView tvHometown; private TextView tvNetwork; private RelativeLayout rlFriends; private TextView tvFriendsCount; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupPopupWindow(); } @Override protected int getLayoutId() { return R.layout.personal_homepage; } private void setupPopupWindow() { View view = mInflater.inflate(R.layout.fresh_news_popupwindow, null); mPopupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, true); mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); mPopupWindow.setAnimationStyle(R.style.fresh_news_popup_animation); mPopupListView = (ListView) view.findViewById(R.id.popup_listview); mTexts = this.getResources().getStringArray(R.array.personal_homepage_filter_list); mPopupAdapter = new FreshNewsPopupAdapter(this, mIcons, mTexts); mPopupListView.setAdapter(mPopupAdapter); // 设置默认选中新鲜事项 fresh_news_type = freshNewsTypes[1]; mPopupAdapter.setPosition(1); mPopupAdapter.notifyDataSetChanged(); topMenuNavbar.tvTitle.setText(mTexts[1]); // 设置顶部下拉菜单的Item事件处理 mPopupListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mPopupWindow.dismiss(); // 当前选择的项与之前的一样,则不做处理。 if (mPopupAdapter.getPosition() == position) { return; } // 新鲜事过滤事件处理 fresh_news_type = freshNewsTypes[position]; LogUtil.i(TAG, "onItemClick position = " + position); LogUtil.i(TAG, "onItemClick fresh_news_type = " + fresh_news_type); mPopupAdapter.setPosition(position); mPopupAdapter.notifyDataSetChanged(); topMenuNavbar.tvTitle.setText(mTexts[position]); tvType.setText(mTexts[position]); if(PERSONAL_HOMEPAGE_TYPE_LATELY.equals(fresh_news_type)) { // 最近来访 Toast.makeText(PersonalHomepageActivity.this.getApplicationContext(), "抱歉,您选择的项官方API暂时未提供如何获取相应的数据!", Toast.LENGTH_LONG).show(); } else if(PERSONAL_HOMEPAGE_TYPE_DATA.equals(fresh_news_type)) { // 资料 tvType.setText("好友信息"); mBasicInfoView.setVisibility(View.VISIBLE); page = 1; mFreshNewsList.clear(); mListView.setPullLoadEnable(false); mListView.setPullRefreshEnable(false); mFreshNewsAdapter.notifyDataSetChanged(); } else { mBasicInfoView.setVisibility(View.GONE); page = 1; mFreshNewsList.clear(); getFreshNews(); } } }); } @Override protected void setupViews() { topMenuNavbar = (TopMenuNavbar) this.findViewById(R.id.rl_top_menu_navbar); topMenuNavbar.tvRightOperationName.setVisibility(View.GONE); topMenuNavbar.ivRightLine.setVisibility(View.GONE); // 将顶部左侧的menu图标换成back图标 LinearLayout llBackMenu = topMenuNavbar.llShowMenu; ImageView ivBack = (ImageView) llBackMenu.findViewById(R.id.iv_back); ivBack.setImageResource(R.drawable.v5_0_1_flipper_head_back); // 将顶部右侧的刷新按钮换成下拉菜单图标 LinearLayout llDownOperation = topMenuNavbar.mLlRefresh; ImageView ivOperation = (ImageView) llDownOperation.findViewById(R.id.iv_refresh); ivOperation.setImageResource(R.drawable.v5_0_1_flipper_head_menu); llBackMenu.setOnClickListener(this); llDownOperation.setOnClickListener(this); topMenuNavbar.mLlDownList.setOnClickListener(this); mListView = (XListView) this.findViewById(R.id.listview); mListView.setPullLoadEnable(false); mListView.setPullRefreshEnable(false); mListView.setXListViewListener(this); // HeadView组件 mInflater = LayoutInflater.from(this.getContext()); LinearLayout mHeadView = (LinearLayout) mInflater.inflate(R.layout.personal_homepage_head, null); mListView.addHeaderView(mHeadView); // 用户基本信息组件 mBasicInfoView = (LinearLayout) mInflater.inflate(R.layout.personal_homepage_user_basic, null); mBasicInfoView.setVisibility(View.GONE); mListView.addFooterView(mBasicInfoView); mFreshNewsAdapter = new FreshNewsAdapter(this, mFreshNewsList); mListView.setAdapter(mFreshNewsAdapter); tvName = (TextView) mHeadView.findViewById(R.id.tv_name); ivIconView = (ImageView) mHeadView.findViewById(R.id.iv_icon); ivStar = (ImageView) mHeadView.findViewById(R.id.iv_star); tvStatusContent = (TextView) mHeadView.findViewById(R.id.tv_status_content); btnVip = (Button) mHeadView.findViewById(R.id.btn_vip); tvType = (TextView) mHeadView.findViewById(R.id.tv_type); tvTypeCount = (TextView) mHeadView.findViewById(R.id.tv_type_count); tvRenrenId = (TextView) mBasicInfoView.findViewById(R.id.tv_renren_id); tvGender = (TextView) mBasicInfoView.findViewById(R.id.tv_gender); tvBirth = (TextView) mBasicInfoView.findViewById(R.id.tv_birth); tvHometown = (TextView) mBasicInfoView.findViewById(R.id.tv_hometown); tvNetwork = (TextView) mBasicInfoView.findViewById(R.id.tv_network); // 好友的数量 rlFriends = (RelativeLayout) mBasicInfoView.findViewById(R.id.rl_friends); tvFriendsCount = (TextView) mBasicInfoView.findViewById(R.id.tv_friends_count); rlFriends.setOnClickListener(this); } @Override protected void initialized() { // TODO Auto-generated method stub uid = this.getIntent().getIntExtra("actor_id", -1); LogUtil.i(TAG, "uid = " + uid); getProfileInfo(); getUserImage(); getFreshNews(); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.ll_back: onBackPressed(); break; case R.id.ll_down_list: if (mPopupWindow != null) { mPopupWindow.showAsDropDown(topMenuNavbar); } break; case R.id.rl_friends: // 切换到好友列表界面 break; default: break; } } // 下拉刷新 @Override public void onRefresh() { page = 1; getFreshNews(); } // 加载更多 @Override public void onLoadMore() { page++; getFreshNews(); } /** * 获取用户个人主页的信息 */ public void getProfileInfo() { String accessToken = mAuthTokenManager.getAccessToken(); LogUtil.e(TAG, "accessToken = " + accessToken); Map<String, String> parameter = new HashMap<String, String>(); parameter.put("v", "1.0"); // API的版本号,固定值为1.0 parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。 parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML parameter.put("call_id", "1.0"); // 请求队列号 parameter.put("method", "users.getProfileInfo"); parameter.put("uid", uid + ""); // 个人主页用户的Id parameter.put("fields", "base_info,status,friends_count"); // 需要获取的信息的字段列表,各个字段用逗号隔开。 AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() { @Override public Object parse(String json) throws JSONException { LogUtil.i(TAG, "getProfileInfo() json = " + json); final JSONObject jsonObject = new JSONObject(json); mHandler.post(new Runnable() { @Override public void run() { String name = jsonObject.optString("name"); LogUtil.i(TAG, "name = " + name); String headurl = jsonObject.optString("headurl"); LogUtil.i(TAG, "headurl = " + headurl); int star = jsonObject.optInt("star"); LogUtil.i(TAG, "star = " + star); JSONObject jsonStatus = jsonObject.optJSONObject("status"); String status = jsonStatus.optString("content"); LogUtil.i(TAG, "status = " + status); tvName.setText(name); tvStatusContent.setText(status); if (star == 1) { ivStar.setVisibility(View.VISIBLE); } // 加载用户图像 /*ImageInfo imgInfo = new ImageInfo(ivIconView, headurl); new ImageLoader(PersonalHomepageActivity.this).displayImage(imgInfo);*/ int friends_count = jsonObject.optInt("friends_count"); LogUtil.i(TAG, "friends_count = " + friends_count); tvFriendsCount.setText(friends_count + "个好友"); int uid = jsonObject.optInt("uid"); LogUtil.i(TAG, "uid = " + uid); String network_name = jsonObject.optString("network_name"); LogUtil.i(TAG, "network_name = " + network_name); JSONObject jsonBaseInfo = jsonObject.optJSONObject("base_info"); JSONObject jsonBirth = jsonBaseInfo.optJSONObject("birth"); JSONObject jsonHometown = jsonBaseInfo.optJSONObject("hometown"); int gender = jsonBaseInfo.optInt("gender"); LogUtil.i(TAG, "gender = " + gender); String birth_month = jsonBirth.optString("birth_month"); LogUtil.i(TAG, "birth_month = " + birth_month); String birth_day = jsonBirth.optString("birth_day"); LogUtil.i(TAG, "birth_day = " + birth_day); String birth_year = jsonBirth.optString("birth_year"); LogUtil.i(TAG, "birth_year = " + birth_year); String province = jsonHometown.optString("province"); LogUtil.i(TAG, "province = " + province); String city = jsonHometown.optString("city"); LogUtil.i(TAG, "city = " + city); String sexString = "男"; if(gender == 0){ sexString = "女"; } tvRenrenId.setText("人人ID:" + uid); tvGender.setText("性别:" + sexString); tvBirth.setText("生日:" + birth_year + "年" + birth_month + "月" + birth_day + "日"); tvHometown.setText("家乡:" + province + " " + city); tvNetwork.setText("网络:" + network_name); } }); return null; } }, new ResultCallback() { @Override public void onSuccess(final Object obj) { /* { "uid":221659942, "status":{"content":"我才知道草莓翻转,是这个意思(偷笑) 转自谭静:明天最后一门考试,结束后,就真的迎来暑假啦~~哇卡卡卡~~~下学期也终于木有课了~~~(twg)(大笑)(ys)(流口水)","time":"2013-07-02 14:37:01"}, "star":1, "network_name":"西北大学", "headurl":"http://hdn.xnimg.cn/photos/hdn421/20130614/1350/tiny_cm9Q_ec73000461fa113e.jpg", "name":"谭静", "base_info":{"birth":{"birth_month":3,"birth_day":21,"birth_year":"1987"},"hometown":{"province":"河北","city":"唐山市"},"gender":0} }*/ } @Override public void onFail(int errorCode) { LogUtil.i(TAG, "freshNewsList errorCode = " + errorCode); } }); mDefaultThreadPool.execute(asyncHttpsPost); mAsyncRequests.add(asyncHttpsPost); } /** * 获取用户的图像 * @param uid 用户Id */ public void getUserImage() { String accessToken = mAuthTokenManager.getAccessToken(); LogUtil.e(TAG, "accessToken = " + accessToken); // 获取用户信息所需的参数 Map<String, String> parameter = new HashMap<String, String>(); parameter.put("v", "1.0"); // API的版本号,固定值为1.0 parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。 parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML,推荐使用JSON,缺省值为XML parameter.put("call_id", "1.0"); // 请求队列号 parameter.put("method", "users.getInfo"); // 你要访问那个接口,我们肯定调用用获取用户的信息的接口咯,该接口支持批量获取。 parameter.put("uids", uid + ""); // 个人主页用户的Id parameter.put("fields", "zidou,vip,mainurl"); // 返回的字段列表,可以指定返回那些字段,用逗号分隔。 AsyncBaseRequest asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() { @Override public Object parse(String json) throws JSONException { LogUtil.i(TAG, "getUserImage() json = " + json); JSONArray jsonArray = new JSONArray(json); JSONObject jsonObject = jsonArray.getJSONObject(0); // 是否为vip用户,值1表示是;值0表示不是 final int zidou = jsonObject.optInt("zidou"); LogUtil.i(TAG, "zidou = " + zidou); // 是否为vip用户等级,前提是zidou节点必须为1 final int vip = jsonObject.optInt("vip"); LogUtil.i(TAG, "vip = " + vip); String headurl = jsonObject.optString("mainurl"); LogUtil.i(TAG, "headurl = " + headurl); if (TextUtils.isEmpty(headurl)) { LogUtil.i(TAG, "用户图像对应的URL为null"); return null; } final String imageUrl = headurl; mHandler.post(new Runnable() { @Override public void run() { if (zidou == 1) { btnVip.setVisibility(View.VISIBLE); btnVip.setText("VIP" + vip); } ImageInfo imgInfo = new ImageInfo(ivIconView, imageUrl); new ImageLoader(PersonalHomepageActivity.this).displayImage(imgInfo); } }); return null; } }, new ResultCallback() { @Override public void onSuccess(Object obj) { // 正常情况下返回的JSON字符串 /*[ { "uid":221659942, "vip":1, "mainurl":"http://hdn.xnimg.cn/photos/hdn221/20130614/1350/h_main_hIfE_e8e9000001ad113e.jpg", "zidou":0 } ]*/ // 异常情况下返回的JSON字符串 /* [ { "uid":600038849, "tinyurl":"http://hdn.xnimg.cn/photos/hdn221/20110212/1700/h_tiny_2ZyG_4a320001f9f62f75.jpg", "vip":1, "sex":1, "name":"折翼の天使", "star":1, "headurl":"http://hdn.xnimg.cn/photos/hdn221/20110212/1700/h_head_jMyd_4a320001f9f62f75.jpg", "zidou":0 } ]*/ } @Override public void onFail(int errorCode) { // TODO Auto-generated method stub } }); mDefaultThreadPool.execute(asyncHttpsPost); mAsyncRequests.add(asyncHttpsPost); } /** * 向服务器端请求新鲜事的数据 */ public void getFreshNews() { String accessToken = mAuthTokenManager.getAccessToken(); LogUtil.e(TAG, "accessToken = " + accessToken); Map<String, String> parameter = new HashMap<String, String>(); parameter.put("v", "1.0"); // API的版本号,固定值为1.0 parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。 parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML parameter.put("call_id", "1.0"); // 请求队列号 parameter.put("method", "feed.get"); parameter.put("type", fresh_news_type); // 新鲜事的类别,多个类型以逗号分隔,type列表 parameter.put("uid", uid + ""); // 支持传入当前用户的一个好友ID,表示获取此好友的新鲜事,如果不传,默认为获取当前用户的新鲜事 parameter.put("page", page + ""); // 支持分页,指定页号,页号从1开始,默认值为1 parameter.put("count", pageCount + ""); // 支持分页,每一页记录数,默认值为30,最大50 AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() { @Override public LinkedList<FreshNews> parse(String json) throws JSONException { LogUtil.i(TAG, "getFreshNews() json = " + json); if ("[]".equals(json)) { return null; } Gson gson = new Gson(); java.lang.reflect.Type type = new TypeToken<LinkedList<FreshNews>>() { }.getType(); LinkedList<FreshNews> freshNewsList = gson.fromJson(json, type); LogUtil.e(TAG, "freshNewsList = " + freshNewsList.size()); return freshNewsList; } }, new ResultCallback() { @Override public void onSuccess(final Object obj) { mHandler.post(new Runnable() { @Override public void run() { if (obj != null && obj instanceof LinkedList) { @SuppressWarnings("unchecked") LinkedList<FreshNews> freshNewsList = (LinkedList<FreshNews>) obj; if (freshNewsList.size() > 0) { // 下拉刷新的数据去重复处理 if (page == 1 && mFreshNewsList.size() > 0) { for (FreshNews freshNews : freshNewsList) { boolean flage = false; for (FreshNews fresh : mFreshNewsList) { if (freshNews.getPost_id() == fresh.getPost_id()) { flage = true; } } if (flage == false) { mFreshNewsList.addFirst(freshNews); } } } else { mFreshNewsList.addAll(freshNewsList); } mListView.setPullLoadEnable(true); mListView.setPullRefreshEnable(true); } } else { mListView.setPullLoadEnable(false); } if (page == 1) { mFreshNewsAdapter.notifyDataSetInvalidated(); mListView.stopRefresh(); } else { mFreshNewsAdapter.notifyDataSetChanged(); mListView.stopLoadMore(); } // 设置刷新时间 SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String refreshTime = mDateFormat.format(System.currentTimeMillis()); mListView.setRefreshTime(refreshTime); } }); } @Override public void onFail(int errorCode) { LogUtil.i(TAG, "freshNewsList errorCode = " + errorCode); } }); mDefaultThreadPool.execute(asyncHttpsPost); mAsyncRequests.add(asyncHttpsPost); }}好了,这一篇就先聊到这里,后面的待续。谢谢大家的关注与支持。
更多相关文章
- Android活跃用户总数达14亿人 平均每4个月增加1亿用户
- Android敲诈者病毒“安卓性能激活”分析(2015年9月版)
- (转帖)Android开发者应该如何推广营销自己的应用程序
- Android靠哪些东西能打败iphone
- Android官方建议关于Android(安卓)APP UI界面设计的一些参考原则
- android 自带的下拉刷新控件,含Demo(SwipeRefreshLayout控件)
- 4.8.4 在Android(安卓)中fragment中获取上下文
- android 自带的下拉刷新控件,含Demo(SwipeRefreshLayout控件)
- android webview设置自适应任意大小的pc网页