package net.oschina.app.ui;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.oschina.app.AppContext;
import net.oschina.app.AppException;
import net.oschina.app.R;
import net.oschina.app.adapter.ListViewFriendAdapter;
import net.oschina.app.bean.FriendList;
import net.oschina.app.bean.FriendList.Friend;
import net.oschina.app.bean.Notice;
import net.oschina.app.common.UIHelper;
import net.oschina.app.widget.PullToRefreshListView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* 用户关注、粉丝
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-3-21
*/
public class UserFriend extends BaseActivity {
private ImageView mBack;
private ProgressBar mProgressbar;
private Button friend_type_fans;
private Button friend_type_follower;
private PullToRefreshListView mlvFriend;
private ListViewFriendAdapter lvFriendAdapter;
private List<Friend> lvFriendData = new ArrayList<Friend>();
private View lvFriend_footer;
private TextView lvFriend_foot_more;
private ProgressBar lvFriend_foot_progress;
private Handler mFriendHandler;
private int lvSumData;
private int curLvCatalog;
private int curLvDataState;
private final static int DATA_LOAD_ING = 0x001;
private final static int DATA_LOAD_COMPLETE = 0x002;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_friend);
this.initView();
this.initData();
}
/**
* 头部按钮展示
* @param type
*/
private void headButtonSwitch(int type) {
switch (type) {
case DATA_LOAD_ING:
mProgressbar.setVisibility(View.VISIBLE);
break;
case DATA_LOAD_COMPLETE:
mProgressbar.setVisibility(View.GONE);
break;
}
}
//初始化视图控件
private void initView()
{
mBack = (ImageView)findViewById(R.id.friend_head_back);
mBack.setOnClickListener(UIHelper.finish(this));
mProgressbar = (ProgressBar)findViewById(R.id.friend_head_progress);
friend_type_fans = (Button)findViewById(R.id.friend_type_fans);
friend_type_follower = (Button)findViewById(R.id.friend_type_follower);
friend_type_fans.setOnClickListener(this.friendBtnClick(friend_type_fans,FriendList.TYPE_FANS));
friend_type_follower.setOnClickListener(this.friendBtnClick(friend_type_follower,FriendList.TYPE_FOLLOWER));
//设置当前分类
curLvCatalog = getIntent().getIntExtra("friend_type", FriendList.TYPE_FOLLOWER);
if(curLvCatalog == FriendList.TYPE_FANS) {
friend_type_fans.setEnabled(false);
} else {
friend_type_follower.setEnabled(false);
}
//设置粉丝与关注的数量
int followers = getIntent().getIntExtra("friend_followers", 0);
int fans = getIntent().getIntExtra("friend_fans", 0);
friend_type_follower.setText(getString(R.string.user_friend_follower, followers));
friend_type_fans.setText(getString(R.string.user_friend_fans, fans));
lvFriend_footer = getLayoutInflater().inflate(R.layout.listview_footer, null);
lvFriend_foot_more = (TextView)lvFriend_footer.findViewById(R.id.listview_foot_more);
lvFriend_foot_progress = (ProgressBar)lvFriend_footer.findViewById(R.id.listview_foot_progress);
lvFriendAdapter = new ListViewFriendAdapter(this, lvFriendData, R.layout.friend_listitem);
mlvFriend = (PullToRefreshListView)findViewById(R.id.friend_listview);
mlvFriend.addFooterView(lvFriend_footer);//添加底部视图 必须在setAdapter前
mlvFriend.setAdapter(lvFriendAdapter);
mlvFriend.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//点击头部、底部栏无效
if(position == 0 || view == lvFriend_footer) return;
TextView name = (TextView)view.findViewById(R.id.friend_listitem_name);
Friend friend = (Friend)name.getTag();
if(friend == null) return;
//跳转
UIHelper.showUserCenter(view.getContext(), friend.getUserid(), friend.getName());
}
});
mlvFriend.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
mlvFriend.onScrollStateChanged(view, scrollState);
//数据为空--不用继续下面代码了
if(lvFriendData.size() == 0) return;
//判断是否滚动到底部
boolean scrollEnd = false;
try {
if(view.getPositionForView(lvFriend_footer) == view.getLastVisiblePosition())
scrollEnd = true;
} catch (Exception e) {
scrollEnd = false;
}
if(scrollEnd && curLvDataState==UIHelper.LISTVIEW_DATA_MORE)
{
mlvFriend.setTag(UIHelper.LISTVIEW_DATA_LOADING);
lvFriend_foot_more.setText(R.string.load_ing);
lvFriend_foot_progress.setVisibility(View.VISIBLE);
//当前pageIndex
int pageIndex = lvSumData/20;
loadLvFriendData(curLvCatalog, pageIndex, mFriendHandler, UIHelper.LISTVIEW_ACTION_SCROLL);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
mlvFriend.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
});
mlvFriend.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
public void onRefresh() {
loadLvFriendData(curLvCatalog, 0, mFriendHandler, UIHelper.LISTVIEW_ACTION_REFRESH);
}
});
}
//初始化控件数据
private void initData()
{
mFriendHandler = new Handler()
{
public void handleMessage(Message msg) {
headButtonSwitch(DATA_LOAD_COMPLETE);
if(msg.what >= 0){
FriendList list = (FriendList)msg.obj;
Notice notice = list.getNotice();
//处理listview数据
switch (msg.arg1) {
case UIHelper.LISTVIEW_ACTION_INIT:
case UIHelper.LISTVIEW_ACTION_REFRESH:
case UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG:
lvSumData = msg.what;
lvFriendData.clear();//先清除原有数据
lvFriendData.addAll(list.getFriendlist());
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
lvSumData += msg.what;
if(lvFriendData.size() > 0){
for(Friend friend1 : list.getFriendlist()){
boolean b = false;
for(Friend friend2 : lvFriendData){
if(friend1.getUserid() == friend2.getUserid()){
b = true;
break;
}
}
if(!b) lvFriendData.add(friend1);
}
}else{
lvFriendData.addAll(list.getFriendlist());
}
break;
}
if(msg.what < 20){
curLvDataState = UIHelper.LISTVIEW_DATA_FULL;
lvFriendAdapter.notifyDataSetChanged();
lvFriend_foot_more.setText(R.string.load_full);
}else if(msg.what == 20){
curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
lvFriendAdapter.notifyDataSetChanged();
lvFriend_foot_more.setText(R.string.load_more);
}
//发送通知广播
if(notice != null){
UIHelper.sendBroadCast(UserFriend.this, notice);
}
}
else if(msg.what == -1){
//有异常--显示加载出错 & 弹出错误消息
curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
lvFriend_foot_more.setText(R.string.load_error);
((AppException)msg.obj).makeToast(UserFriend.this);
}
if(lvFriendData.size()==0){
curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY;
lvFriend_foot_more.setText(R.string.load_empty);
}
lvFriend_foot_progress.setVisibility(View.GONE);
if(msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH){
mlvFriend.onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString());
mlvFriend.setSelection(0);
}else if(msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG){
mlvFriend.onRefreshComplete();
mlvFriend.setSelection(0);
}
}
};
this.loadLvFriendData(curLvCatalog,0,mFriendHandler,UIHelper.LISTVIEW_ACTION_INIT);
}
/**
* 线程加载好友列表数据
* @param type 0:显示自己的粉丝 1:显示自己的关注者
* @param pageIndex 当前页数
* @param handler 处理器
* @param action 动作标识
*/
private void loadLvFriendData(final int type,final int pageIndex,final Handler handler,final int action){
headButtonSwitch(DATA_LOAD_ING);
new Thread(){
public void run() {
Message msg = new Message();
boolean isRefresh = false;
if(action == UIHelper.LISTVIEW_ACTION_REFRESH || action == UIHelper.LISTVIEW_ACTION_SCROLL)
isRefresh = true;
try {
FriendList FriendList = ((AppContext)getApplication()).getFriendList(type, pageIndex, isRefresh);
msg.what = FriendList.getFriendlist().size();
msg.obj = FriendList;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;//告知handler当前action
if(curLvCatalog == type)
handler.sendMessage(msg);
}
}.start();
}
private View.OnClickListener friendBtnClick(final Button btn,final int catalog){
return new View.OnClickListener() {
public void onClick(View v) {
if(btn == friend_type_fans)
friend_type_fans.setEnabled(false);
else
friend_type_fans.setEnabled(true);
if(btn == friend_type_follower)
friend_type_follower.setEnabled(false);
else
friend_type_follower.setEnabled(true);
lvFriend_foot_more.setText(R.string.load_more);
lvFriend_foot_progress.setVisibility(View.GONE);
curLvCatalog = catalog;
loadLvFriendData(curLvCatalog, 0, mFriendHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
};
}
}