package com.michael.doubanonline;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
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.ArrayAdapter;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.alibaba.fastjson.JSON;
import com.michael.doubanonline.base.BaseActivity;
import com.michael.doubanonline.bean.OnlineList;
import com.michael.doubanonline.bean.OnlineObject;
import com.michael.doubanonline.component.PullToRefreshListViewWithFooter;
import com.michael.doubanonline.component.PullToRefreshListViewWithFooter.OnFooterListViewLastItemVisibleListener;
import com.michael.doubanonline.component.PullToRefreshListViewWithFooter.OnFooterListViewRefreshListener;
import com.michael.doubanonline.db.DBManager;
import com.michael.doubanonline.http.InterfaceLib;
import com.michael.doubanonline.http.RequestTask;
import com.michael.doubanonline.http.RequestTask.OnTaskResultListener;
import com.michael.doubanonline.util.ToastUtil;
//import android.widget.LinearLayout;
/**
* 线上活动主界面
*
* https://api.douban.com/v2/onlines
*
* 给AndroidClient一个是否刷新和缓存失效的时间
*
* */
public class MainActivity extends BaseActivity implements ActionBar.OnNavigationListener{
/** 用来展示线上活动的ListView*/
private PullToRefreshListViewWithFooter lvOnlines;
/** ListView的适配器*/
private MainAdapter adapter;
/** ListView的数据源*/
private ArrayList<OnlineObject> dataList;
/** 数据库管理器*/
private DBManager dbManager;
/** 每页请求的数据*/
private static int PAGE_SIZE = 10;
/** 服务端所有的活动数量*/
private int totalOnlineCount;
/** 分类 */
private String sortBy;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setActionBar();
iniComponent();
}
private void iniComponent()
{
sortBy = InterfaceLib.GetOnlineList.CATE_TYPE_DAY;
lvOnlines = (PullToRefreshListViewWithFooter)findViewById(R.id.lvOnlines);
lvOnlines.setEmptyView(getEmptyView());
dataList = new ArrayList<OnlineObject>();
adapter = new MainAdapter(this, dataList);
lvOnlines.setAdapter(adapter);
dbManager = DBManager.getInstance();
iniListener();
}
/**
* 没有评论的时候显示
* */
private View getEmptyView()
{
LayoutInflater layoutInflater = this.getLayoutInflater();
View emptyView = (View) layoutInflater.inflate(R.layout.layout_no_comment_empty_view, lvOnlines, false);
TextView tvNoComments = (TextView)emptyView.findViewById(R.id.tvNoComments);
tvNoComments.setText("没有数据,请检查网络~");
tvNoComments.setTextSize(18);
emptyView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
lvOnlines.setRefreshing();
}
});
return emptyView;
}
private void iniListener(){
//下拉刷新
lvOnlines.setOnFooterListViewRefreshListener(new OnFooterListViewRefreshListener() {
@Override
public void onFooterListViewRefresh() {
requestData(true);
}
});
//加载更多
lvOnlines.setOnFooterListViewLastItemVisibleListener(new OnFooterListViewLastItemVisibleListener() {
@Override
public void onFooterListViewLastItemVisible() {
if(dataList.size() == totalOnlineCount)
{
lvOnlines.setListViewFooterContent(PullToRefreshListViewWithFooter.LOADING_STATE_DONE, "全部加载完毕了哦~");
}
else
{
requestData(false);
}
}
});
lvOnlines.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
OnlineObject online = (OnlineObject)parent.getItemAtPosition(position);
Intent intent = new Intent(MainActivity.this, OnlineDetailActivity.class);
intent.putExtra(OnlineDetailActivity.INTENT_KEY_ID, online.getId());
intent.putExtra(OnlineDetailActivity.INTENT_KEY_TITLE, online.getTitle());
intent.putExtra(OnlineDetailActivity.INTENT_KEY_DETAIL, online.getDesc());
MainActivity.this.startActivity(intent);
}
});
}
/**
* 将Json解析为Bean
* */
private OnlineList resolveJsonToBean(String jsonString)
{
return JSON.parseObject(jsonString, OnlineList.class);
}
/**
* 设置ActionBar
*
* */
private void setActionBar() {
ActionBar actionBar = getSupportActionBar();
Context context = actionBar.getThemedContext();
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context, R.array.main_titles, R.layout.sherlock_spinner_item);//sherlock_spinner_item
// list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);//这里有一个问题,如果高度不换掉会出错。所以使用自定义的layout,如下
// https://groups.google.com/forum/?fromgroups=#!topic/actionbarsherlock/aODtoH2aS-s
list.setDropDownViewResource(R.layout.list_action_bar_item);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(list, this);
actionBar.setIcon(R.drawable.ic_launcher);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME);
actionBar.setHomeButtonEnabled(true);//图标可以点击
// actionBar.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.action_bar_bg));
actionBar.setDisplayShowCustomEnabled(true);
//正在加载的小圈圈的另一种实现方式
// LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// View view = layoutInflater.inflate(R.layout.layout_actionbar_progressbar, null);
// actionBar.setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.RIGHT|Gravity.CENTER));
}
private RequestTask request;
/**
* 获取数据
*
* */
private void requestData(final boolean isPullToRefresh)
{
RequestTask request = new RequestTask(this, "获取活动列表");
request.setOnTaskResultListener2(new OnTaskResultListener()
{
@Override
public void onStart()
{
setRefreshState(true);
lvOnlines.setListViewFooterContent(PullToRefreshListViewWithFooter.LOADING_STATE_LOADING);
}
@Override
public void onSuccess(String jsonResponse)
{
if (jsonResponse != null)
{
OnlineList onlines = resolveJsonToBean(jsonResponse);
if(onlines != null)
{
totalOnlineCount = Integer.parseInt(onlines.getTotal());
boolean isClear = false;
if(isPullToRefresh && onlines.getOnlines().size() > 0)
{
isClear = true;
int cacheType = DBManager.ONLINE_LIST_DAY;
if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_DAY))
{
cacheType = DBManager.ONLINE_LIST_DAY;
}
else if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_WEEK))
{
cacheType = DBManager.ONLINE_LIST_WEEK;
}
else if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_LATEST))
{
cacheType = DBManager.ONLINE_LIST_LATEST;
}
dbManager.insertCache(cacheType, jsonResponse);// 写入缓存
}
updateListView(onlines, isClear);
}
else
{
ToastUtil.show("数据解析失败");
}
}
else
{
ToastUtil.show("获取数据为空");
}
lvOnlines.setListViewFooterContent(PullToRefreshListViewWithFooter.LOADING_STATE_DONE);
}
@Override
public void onFail(String message)
{
lvOnlines.setListViewFooterContent(PullToRefreshListViewWithFooter.LOADING_STATE_FAIL);
}
@Override
public void onFinish()
{
lvOnlines.onRefreshComplete();
setRefreshState(false);
}
});
HashMap<String, String> map = new HashMap<String, String>();
map.put(InterfaceLib.GetOnlineList.cate, sortBy);
map.put(InterfaceLib.GetOnlineList.start, getStart(isPullToRefresh)+"");
map.put(InterfaceLib.GetOnlineList.count, PAGE_SIZE+"");
request.request(InterfaceLib.GetOnlineList.apiActionName, map);
}
/**
* 更新ListView
*
* @param onlines 数据源
* @param isClear 是否清空旧数据
*/
private void updateListView(OnlineList onlines, boolean isClear)
{
if(isClear)
{
dataList.clear();
}
dataList.addAll(onlines.getOnlines());
adapter.notifyDataSetChanged();
lvOnlines.setFooterViewVisibility(View.VISIBLE);
}
/**
* 获取当前需要从哪一个开始下载
* */
private int getStart(boolean isPullToRefresh)
{
if(dataList == null || dataList.size() == 0 || isPullToRefresh)
{
return 0;
}
return dataList.size();
}
/**
* 处理导航项的点击事件
* 默认就会进行调用
*
* */
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId)
{
switch (itemPosition)
{
case 0:
sortBy = InterfaceLib.GetOnlineList.CATE_TYPE_DAY;//本日最热
iniDataWithCacheIfExistOrRequestData();
break;
case 1:
sortBy = InterfaceLib.GetOnlineList.CATE_TYPE_WEEK;//本周最热
iniDataWithCacheIfExistOrRequestData();
break;
case 2:
sortBy = InterfaceLib.GetOnlineList.CATE_TYPE_LATEST;//最新活动
iniDataWithCacheIfExistOrRequestData();
break;
case 3:
// UserInfo userInfo = AccountHelper.getUserInfo(this);
//TODO 无法调用我的活动的接口,暂时保留
break;
default:
break;
}
return true;
}
/**
* 设置当前刷新按钮是否可见,true设置为可见
* */
public void setRefreshState(boolean isRefresh) {
if (menuRefresh == null) {
return;
}
if (isRefresh) {
menuRefresh.setVisible(true);
} else {
menuRefresh.setVisible(false);
}
}
private MenuItem menuRefresh;
// private MenuItem menuNotice;
// private MenuItem menuLogout;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main_menu, menu);
//刷新
menuRefresh = menu.findItem(R.id.menu_refresh);
menuRefresh.setActionView(R.layout.layout_menu_item_refresh);// 设置为一个ProgressBar
setRefreshState(false);
// //通知
// menuNotice = menu.findItem(R.id.menu_notice);
// menuNotice.setOnMenuItemClickListener(new OnMenuItemClickListener()
// {
//
// @Override
// public boolean onMenuItemClick(MenuItem item)
// {
// ToastUtil.show("通知被点击");
// //TODO
// return false;
// }
// });
// //退出
// menuLogout = menu.findItem(R.id.menu_logout);
// menuLogout.setOnMenuItemClickListener(new OnMenuItemClickListener()
// {
//
// @Override
// public boolean onMenuItemClick(MenuItem item)
// {
// final DialogCancelOrComfirm dialog = new DialogCancelOrComfirm(MainActivity.this);
// dialog.setOnComfirmButtonClicked(new OnComfirmButtonClicked()
// {
//
// @Override
// public void clicked(int buttonIndex)
// {
// switch (buttonIndex)
// {
// case DialogCancelOrComfirm.BUTTON_CANCEL:
// dialog.dismissDialog();
// break;
// case DialogCancelOrComfirm.BUTTON_COMFIRM:
// //TODO
// break;
// default:
// break;
// }
// }
// });
// dialog.showDialog("确认退出吗?");
// return false;
// }
// });
return super.onCreateOptionsMenu(menu);
}
/**
* 如果缓存存在就载入缓存,否则从网络请求
* */
private void iniDataWithCacheIfExistOrRequestData()
{
String jsonCache = null;
if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_DAY))
{
jsonCache = dbManager.getCache(DBManager.ONLINE_LIST_DAY);
}
else if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_WEEK))
{
jsonCache = dbManager.getCache(DBManager.ONLINE_LIST_WEEK);
}
else if(sortBy.equals(InterfaceLib.GetOnlineList.CATE_TYPE_LATEST))
{
jsonCache = dbManager.getCache(DBManager.ONLINE_LIST_LATEST);
}
if(jsonCache != null && !jsonCache.equals(""))
{
OnlineList onlines = resolveJsonToBean(jsonCache);
updateListView(onlines, true);
}
else
{
requestData(true);
}
}
@Override
public void onDestroy()
{
super.onDestroy();
if(request != null)
{
request.cancelRequest();
}
}
/**
* 跳转到关于的界面
* */
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(MainActivity.this, AboutActivity.class);
startActivity(intent);
return true;
}
return (super.onOptionsItemSelected(menuItem));
}
}