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); } }; } }