Android仿人人客户端(v5.7.1)——个人主页(二)

来源:互联网 发布:js可以抓取placeholder 编辑:程序博客网 时间:2024/06/06 00:35

转载请标明出处:
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点击事件处理器(publicvoid 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);    }}
          好了,这一篇就先聊到这里,后面的待续。谢谢大家的关注与支持。


原创粉丝点击