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

转载请标明出处:
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);
    }

}
          好了,这一篇就先聊到这里,后面的待续。谢谢大家的关注与支持。


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值