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.ListViewFavoriteAdapter;
import net.oschina.app.bean.FavoriteList;
import net.oschina.app.bean.Notice;
import net.oschina.app.bean.Result;
import net.oschina.app.bean.FavoriteList.Favorite;
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 UserFavorite extends BaseActivity {
private ImageView mBack;
private ProgressBar mProgressbar;
private Button favorite_catalog_software;
private Button favorite_catalog_post;
private Button favorite_catalog_code;
private Button favorite_catalog_blog;
private Button favorite_catalog_news;
private PullToRefreshListView mlvFavorite;
private ListViewFavoriteAdapter lvFavoriteAdapter;
private List<Favorite> lvFavoriteData = new ArrayList<Favorite>();
private View lvFavorite_footer;
private TextView lvFavorite_foot_more;
private ProgressBar lvFavorite_foot_progress;
private Handler mFavoriteHandler;
private int lvSumData;
private int curFavoriteCatalog;
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_favorite);
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.favorite_head_back);
mBack.setOnClickListener(UIHelper.finish(this));
mProgressbar = (ProgressBar)findViewById(R.id.favorite_head_progress);
favorite_catalog_software = (Button)findViewById(R.id.favorite_catalog_software);
favorite_catalog_post = (Button)findViewById(R.id.favorite_catalog_post);
favorite_catalog_code = (Button)findViewById(R.id.favorite_catalog_code);
favorite_catalog_blog = (Button)findViewById(R.id.favorite_catalog_blog);
favorite_catalog_news = (Button)findViewById(R.id.favorite_catalog_news);
favorite_catalog_software.setOnClickListener(this.favoriteBtnClick(favorite_catalog_software,FavoriteList.TYPE_SOFTWARE));
favorite_catalog_post.setOnClickListener(this.favoriteBtnClick(favorite_catalog_post,FavoriteList.TYPE_POST));
favorite_catalog_code.setOnClickListener(this.favoriteBtnClick(favorite_catalog_code,FavoriteList.TYPE_CODE));
favorite_catalog_blog.setOnClickListener(this.favoriteBtnClick(favorite_catalog_blog,FavoriteList.TYPE_BLOG));
favorite_catalog_news.setOnClickListener(this.favoriteBtnClick(favorite_catalog_news,FavoriteList.TYPE_NEWS));
favorite_catalog_software.setEnabled(false);
curFavoriteCatalog = FavoriteList.TYPE_SOFTWARE;
lvFavorite_footer = getLayoutInflater().inflate(R.layout.listview_footer, null);
lvFavorite_foot_more = (TextView)lvFavorite_footer.findViewById(R.id.listview_foot_more);
lvFavorite_foot_progress = (ProgressBar)lvFavorite_footer.findViewById(R.id.listview_foot_progress);
lvFavoriteAdapter = new ListViewFavoriteAdapter(this, lvFavoriteData, R.layout.favorite_listitem);
mlvFavorite = (PullToRefreshListView)findViewById(R.id.favorite_listview);
mlvFavorite.addFooterView(lvFavorite_footer);//添加底部视图 必须在setAdapter前
mlvFavorite.setAdapter(lvFavoriteAdapter);
mlvFavorite.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//点击头部、底部栏无效
if(position == 0 || view == lvFavorite_footer) return;
Favorite fav = null;
//判断是否是TextView
if(view instanceof TextView){
fav = (Favorite)view.getTag();
}else{
TextView title = (TextView)view.findViewById(R.id.favorite_listitem_title);
fav = (Favorite)title.getTag();
}
if(fav == null) return;
//跳转
UIHelper.showUrlRedirect(view.getContext(), fav.url);
}
});
mlvFavorite.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
mlvFavorite.onScrollStateChanged(view, scrollState);
//数据为空--不用继续下面代码了
if(lvFavoriteData.size() == 0) return;
//判断是否滚动到底部
boolean scrollEnd = false;
try {
if(view.getPositionForView(lvFavorite_footer) == view.getLastVisiblePosition())
scrollEnd = true;
} catch (Exception e) {
scrollEnd = false;
}
if(scrollEnd && curLvDataState==UIHelper.LISTVIEW_DATA_MORE)
{
mlvFavorite.setTag(UIHelper.LISTVIEW_DATA_LOADING);
lvFavorite_foot_more.setText(R.string.load_ing);
lvFavorite_foot_progress.setVisibility(View.VISIBLE);
//当前pageIndex
int pageIndex = lvSumData/20;
loadLvFavoriteData(curFavoriteCatalog, pageIndex, mFavoriteHandler, UIHelper.LISTVIEW_ACTION_SCROLL);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
mlvFavorite.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
});
mlvFavorite.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//点击头部、底部栏无效
if(position == 0 || view == lvFavorite_footer) return false;
Favorite _fav = null;
//判断是否是TextView
if(view instanceof TextView){
_fav = (Favorite)view.getTag();
}else{
TextView title = (TextView)view.findViewById(R.id.favorite_listitem_title);
_fav = (Favorite)title.getTag();
}
if(_fav == null) return false;
final Favorite fav = _fav;
final AppContext ac = (AppContext)getApplication();
//操作--删除
final int uid = ac.getLoginUid();
final Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == 1){
Result res = (Result)msg.obj;
if(res.OK()){
lvFavoriteData.remove(fav);
lvFavoriteAdapter.notifyDataSetChanged();
}
UIHelper.ToastMessage(UserFavorite.this, res.getErrorMessage());
}else{
((AppException)msg.obj).makeToast(UserFavorite.this);
}
}
};
final Thread thread = new Thread(){
public void run() {
Message msg = new Message();
try {
Result res = ac.delFavorite(uid, fav.objid, fav.type);
msg.what = 1;
msg.obj = res;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
handler.sendMessage(msg);
}
};
UIHelper.showFavoriteOptionDialog(UserFavorite.this, thread);
return true;
}
});
mlvFavorite.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
public void onRefresh() {
loadLvFavoriteData(curFavoriteCatalog, 0, mFavoriteHandler, UIHelper.LISTVIEW_ACTION_REFRESH);
}
});
}
//初始化控件数据
private void initData()
{
mFavoriteHandler = new Handler()
{
public void handleMessage(Message msg) {
headButtonSwitch(DATA_LOAD_COMPLETE);
if(msg.what >= 0){
FavoriteList list = (FavoriteList)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;
lvFavoriteData.clear();//先清除原有数据
lvFavoriteData.addAll(list.getFavoritelist());
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
lvSumData += msg.what;
if(lvFavoriteData.size() > 0){
for(Favorite fav1 : list.getFavoritelist()){
boolean b = false;
for(Favorite fav2 : lvFavoriteData){
if(fav1.objid == fav2.objid){
b = true;
break;
}
}
if(!b) lvFavoriteData.add(fav1);
}
}else{
lvFavoriteData.addAll(list.getFavoritelist());
}
break;
}
if(msg.what < 20){
curLvDataState = UIHelper.LISTVIEW_DATA_FULL;
lvFavoriteAdapter.notifyDataSetChanged();
lvFavorite_foot_more.setText(R.string.load_full);
}else if(msg.what == 20){
curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
lvFavoriteAdapter.notifyDataSetChanged();
lvFavorite_foot_more.setText(R.string.load_more);
}
//发送通知广播
if(notice != null){
UIHelper.sendBroadCast(UserFavorite.this, notice);
}
}
else if(msg.what == -1){
//有异常--显示加载出错 & 弹出错误消息
curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
lvFavorite_foot_more.setText(R.string.load_error);
((AppException)msg.obj).makeToast(UserFavorite.this);
}
if(lvFavoriteData.size()==0){
curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY;
lvFavorite_foot_more.setText(R.string.load_empty);
}
lvFavorite_foot_progress.setVisibility(View.GONE);
if(msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH){
mlvFavorite.onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString());
mlvFavorite.setSelection(0);
}else if(msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG){
mlvFavorite.onRefreshComplete();
mlvFavorite.setSelection(0);
}
}
};
this.loadLvFavoriteData(curFavoriteCatalog,0,mFavoriteHandler,UIHelper.LISTVIEW_ACTION_INIT);
}
/**
* 线程加载收藏数据
* @param type 0:全部收藏 1:软件 2:话题 3:博客 4:新闻 5:代码
* @param pageIndex 当前页数
* @param handler 处理器
* @param action 动作标识
*/
private void loadLvFavoriteData(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 {
FavoriteList favoriteList = ((AppContext)getApplication()).getFavoriteList(type, pageIndex, isRefresh);
msg.what = favoriteList.getPageSize();
msg.obj = favoriteList;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;//告知handler当前action
if(curFavoriteCatalog == type)
handler.sendMessage(msg);
}
}.start();
}
private View.OnClickListener favoriteBtnClick(final Button btn,final int catalog){
return new View.OnClickListener() {
public void onClick(View v) {
if(btn == favorite_catalog_blog)
favorite_catalog_blog.setEnabled(false);
else
favorite_catalog_blog.setEnabled(true);
if(btn == favorite_catalog_code)
favorite_catalog_code.setEnabled(false);
else
favorite_catalog_code.setEnabled(true);
if(btn == favorite_catalog_news)
favorite_catalog_news.setEnabled(false);
else
favorite_catalog_news.setEnabled(true);
if(btn == favorite_catalog_post)
favorite_catalog_post.setEnabled(false);
else
favorite_catalog_post.setEnabled(true);
if(btn == favorite_catalog_software)
favorite_catalog_software.setEnabled(false);
else
favorite_catalog_software.setEnabled(true);
lvFavorite_foot_more.setText(R.string.load_more);
lvFavorite_foot_progress.setVisibility(View.GONE);
curFavoriteCatalog = catalog;
loadLvFavoriteData(curFavoriteCatalog, 0, mFavoriteHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
};
}
}