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.ListViewSoftwareAdapter;
import net.oschina.app.adapter.ListViewSoftwareCatalogAdapter;
import net.oschina.app.bean.Notice;
import net.oschina.app.bean.SoftwareCatalogList;
import net.oschina.app.bean.SoftwareCatalogList.SoftwareType;
import net.oschina.app.bean.SoftwareList;
import net.oschina.app.bean.SoftwareList.Software;
import net.oschina.app.common.StringUtils;
import net.oschina.app.common.UIHelper;
import net.oschina.app.widget.PullToRefreshListView;
import net.oschina.app.widget.ScrollLayout;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* 软件库
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-3-21
*/
public class SoftwareLib extends BaseActivity{
private ImageView mBack;
private TextView mTitle;
private ProgressBar mProgressbar;
private ScrollLayout mScrollLayout;
private Button software_catalog;
private Button software_recommend;
private Button software_lastest;
private Button software_hot;
private Button software_china;
private PullToRefreshListView mlvSoftware;
private ListViewSoftwareAdapter lvSoftwareAdapter;
private List<Software> lvSoftwareData = new ArrayList<Software>();
private View lvSoftware_footer;
private TextView lvSoftware_foot_more;
private ProgressBar lvSoftware_foot_progress;
private Handler mSoftwareHandler;
private int lvSumData;
private ListView mlvSoftwareCatalog;
private ListViewSoftwareCatalogAdapter lvSoftwareCatalogAdapter;
private List<SoftwareType> lvSoftwareCatalogData = new ArrayList<SoftwareType>();
private Handler mSoftwareCatalogHandler;
private ListView mlvSoftwareTag;
private ListViewSoftwareCatalogAdapter lvSoftwareTagAdapter;
private List<SoftwareType> lvSoftwareTagData = new ArrayList<SoftwareType>();
private Handler mSoftwareTagHandler;
private int curHeadTag = HEAD_TAG_CATALOG;//默认初始头部标签
private int curScreen = SCREEN_CATALOG;//默认当前屏幕
private int curSearchTag;//当前二级分类的Tag
private int curLvSoftwareDataState;
private String curTitleLV1;//当前一级分类标题
private final static int HEAD_TAG_CATALOG = 0x001;
private final static int HEAD_TAG_RECOMMEND = 0x002;
private final static int HEAD_TAG_LASTEST = 0x003;
private final static int HEAD_TAG_HOT = 0x004;
private final static int HEAD_TAG_CHINA = 0x005;
private final static int DATA_LOAD_ING = 0x001;
private final static int DATA_LOAD_COMPLETE = 0x002;
private final static int SCREEN_CATALOG = 0;
private final static int SCREEN_TAG = 1;
private final static int SCREEN_SOFTWARE = 2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frame_software);
this.initView();
this.initData();
}
//初始化视图控件
private void initView()
{
mBack = (ImageView)findViewById(R.id.frame_software_head_back);
mTitle = (TextView)findViewById(R.id.frame_software_head_title);
mProgressbar = (ProgressBar)findViewById(R.id.frame_software_head_progress);
mScrollLayout = (ScrollLayout) findViewById(R.id.frame_software_scrolllayout);
mBack.setOnClickListener(backClickListener);
//禁用滑动
mScrollLayout.setIsScroll(false);
software_catalog = (Button)findViewById(R.id.frame_btn_software_catalog);
software_recommend = (Button)findViewById(R.id.frame_btn_software_recommend);
software_lastest = (Button)findViewById(R.id.frame_btn_software_lastest);
software_hot = (Button)findViewById(R.id.frame_btn_software_hot);
software_china = (Button)findViewById(R.id.frame_btn_software_china);
software_catalog.setOnClickListener(this.softwareBtnClick(software_catalog,HEAD_TAG_CATALOG,"开源软件库"));
software_recommend.setOnClickListener(this.softwareBtnClick(software_recommend,HEAD_TAG_RECOMMEND,"每周推荐软件"));
software_lastest.setOnClickListener(this.softwareBtnClick(software_lastest,HEAD_TAG_LASTEST,"最新软件列表"));
software_hot.setOnClickListener(this.softwareBtnClick(software_hot,HEAD_TAG_HOT,"热门软件列表"));
software_china.setOnClickListener(this.softwareBtnClick(software_china,HEAD_TAG_CHINA,"国产软件列表"));
software_catalog.setEnabled(false);
this.initSoftwareCatalogListView();
this.initSoftwareTagListView();
this.initSoftwareListView();
}
//初始化分类listview
private void initSoftwareCatalogListView()
{
lvSoftwareCatalogAdapter = new ListViewSoftwareCatalogAdapter(this, lvSoftwareCatalogData, R.layout.softwarecatalog_listitem);
mlvSoftwareCatalog = (ListView)findViewById(R.id.frame_software_listview_catalog);
mlvSoftwareCatalog.setAdapter(lvSoftwareCatalogAdapter);
mlvSoftwareCatalog.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView name = (TextView)view.findViewById(R.id.softwarecatalog_listitem_name);
SoftwareType type = (SoftwareType)name.getTag();
if(type == null) return;
if(type.tag > 0){
curTitleLV1 = type.name;
mTitle.setText(curTitleLV1);
//加载二级分类
curScreen = SCREEN_TAG;
mScrollLayout.scrollToScreen(curScreen);
loadLvSoftwareCatalogData(type.tag, mSoftwareTagHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
}
});
mSoftwareCatalogHandler = new Handler()
{
public void handleMessage(Message msg) {
headButtonSwitch(DATA_LOAD_COMPLETE);
if(msg.what >= 0){
SoftwareCatalogList list = (SoftwareCatalogList)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:
lvSoftwareCatalogData.clear();//先清除原有数据
lvSoftwareCatalogData.addAll(list.getSoftwareTypelist());
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
break;
}
lvSoftwareCatalogAdapter.notifyDataSetChanged();
//发送通知广播
if(notice != null){
UIHelper.sendBroadCast(SoftwareLib.this, notice);
}
}
else if(msg.what == -1){
//有异常--显示加载出错 & 弹出错误消息
((AppException)msg.obj).makeToast(SoftwareLib.this);
}
}
};
}
//初始化二级分类listview
private void initSoftwareTagListView()
{
lvSoftwareTagAdapter = new ListViewSoftwareCatalogAdapter(this, lvSoftwareTagData, R.layout.softwarecatalog_listitem);
mlvSoftwareTag = (ListView)findViewById(R.id.frame_software_listview_tag);
mlvSoftwareTag.setAdapter(lvSoftwareTagAdapter);
mlvSoftwareTag.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView name = (TextView)view.findViewById(R.id.softwarecatalog_listitem_name);
SoftwareType type = (SoftwareType)name.getTag();
if(type == null) return;
if(type.tag > 0){
mTitle.setText(type.name);
//加载软件列表
curScreen = SCREEN_SOFTWARE;
mScrollLayout.scrollToScreen(curScreen);
curSearchTag = type.tag;
loadLvSoftwareTagData(curSearchTag, 0, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
}
});
mSoftwareTagHandler = new Handler()
{
public void handleMessage(Message msg) {
headButtonSwitch(DATA_LOAD_COMPLETE);
if(msg.what >= 0){
SoftwareCatalogList list = (SoftwareCatalogList)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:
lvSoftwareTagData.clear();//先清除原有数据
lvSoftwareTagData.addAll(list.getSoftwareTypelist());
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
break;
}
lvSoftwareTagAdapter.notifyDataSetChanged();
//发送通知广播
if(notice != null){
UIHelper.sendBroadCast(SoftwareLib.this, notice);
}
}
else if(msg.what == -1){
//有异常--显示加载出错 & 弹出错误消息
((AppException)msg.obj).makeToast(SoftwareLib.this);
}
}
};
}
//初始化软件listview
private void initSoftwareListView()
{
lvSoftware_footer = getLayoutInflater().inflate(R.layout.listview_footer, null);
lvSoftware_foot_more = (TextView)lvSoftware_footer.findViewById(R.id.listview_foot_more);
lvSoftware_foot_progress = (ProgressBar)lvSoftware_footer.findViewById(R.id.listview_foot_progress);
lvSoftwareAdapter = new ListViewSoftwareAdapter(this, lvSoftwareData, R.layout.software_listitem);
mlvSoftware = (PullToRefreshListView)findViewById(R.id.frame_software_listview);
mlvSoftware.addFooterView(lvSoftware_footer);//添加底部视图 必须在setAdapter前
mlvSoftware.setAdapter(lvSoftwareAdapter);
mlvSoftware.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//点击头部、底部栏无效
if(position == 0 || view == lvSoftware_footer) return;
TextView name = (TextView)view.findViewById(R.id.software_listitem_name);
Software sw = (Software)name.getTag();
if(sw == null) return;
//跳转
UIHelper.showUrlRedirect(view.getContext(), sw.url);
}
});
mlvSoftware.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
mlvSoftware.onScrollStateChanged(view, scrollState);
//数据为空--不用继续下面代码了
if(lvSoftwareData.size() == 0) return;
//判断是否滚动到底部
boolean scrollEnd = false;
try {
if(view.getPositionForView(lvSoftware_footer) == view.getLastVisiblePosition())
scrollEnd = true;
} catch (Exception e) {
scrollEnd = false;
}
if(scrollEnd && curLvSoftwareDataState==UIHelper.LISTVIEW_DATA_MORE)
{
mlvSoftware.setTag(UIHelper.LISTVIEW_DATA_LOADING);
lvSoftware_foot_more.setText(R.string.load_ing);
lvSoftware_foot_progress.setVisibility(View.VISIBLE);
//当前pageIndex
int pageIndex = lvSumData/20;
if(curHeadTag == HEAD_TAG_CATALOG)
loadLvSoftwareTagData(curSearchTag, pageIndex, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_SCROLL);
else
loadLvSoftwareData(curHeadTag, pageIndex, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_SCROLL);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
mlvSoftware.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
});
mlvSoftware.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
public void onRefresh() {
if(curHeadTag == HEAD_TAG_CATALOG)
loadLvSoftwareTagData(curSearchTag, 0, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_REFRESH);
else
loadLvSoftwareData(curHeadTag, 0, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_REFRESH);
}
});
mSoftwareHandler = new Handler()
{
public void handleMessage(Message msg) {
headButtonSwitch(DATA_LOAD_COMPLETE);
if(msg.what >= 0){
SoftwareList list = (SoftwareList)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;
lvSoftwareData.clear();//先清除原有数据
lvSoftwareData.addAll(list.getSoftwarelist());
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
lvSumData += msg.what;
if(lvSoftwareData.size() > 0){
for(Software sw1 : list.getSoftwarelist()){
boolean b = false;
for(Software sw2 : lvSoftwareData){
if(sw1.name.equals(sw2.name)){
b = true;
break;
}
}
if(!b) lvSoftwareData.add(sw1);
}
}else{
lvSoftwareData.addAll(list.getSoftwarelist());
}
break;
}
if(msg.what < 20){
curLvSoftwareDataState = UIHelper.LISTVIEW_DATA_FULL;
lvSoftwareAdapter.notifyDataSetChanged();
lvSoftware_foot_more.setText(R.string.load_full);
}else if(msg.what == 20){
curLvSoftwareDataState = UIHelper.LISTVIEW_DATA_MORE;
lvSoftwareAdapter.notifyDataSetChanged();
lvSoftware_foot_more.setText(R.string.load_more);
}
//发送通知广播
if(notice != null){
UIHelper.sendBroadCast(SoftwareLib.this, notice);
}
}
else if(msg.what == -1){
//有异常--显示加载出错 & 弹出错误消息
curLvSoftwareDataState = UIHelper.LISTVIEW_DATA_MORE;
lvSoftware_foot_more.setText(R.string.load_error);
((AppException)msg.obj).makeToast(SoftwareLib.this);
}
if(lvSoftwareData.size()==0){
curLvSoftwareDataState = UIHelper.LISTVIEW_DATA_EMPTY;
lvSoftware_foot_more.setText(R.string.load_empty);
}
lvSoftware_foot_progress.setVisibility(View.GONE);
if(msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH){
mlvSoftware.onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString());
mlvSoftware.setSelection(0);
}else if(msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG){
mlvSoftware.onRefreshComplete();
mlvSoftware.setSelection(0);
}
}
};
}
//初始化控件数据
private void initData()
{
this.loadLvSoftwareCatalogData(0, mSoftwareCatalogHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
/**
* 头部按钮展示
* @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 View.OnClickListener softwareBtnClick(final Button btn,final int tag,final String title){
return new View.OnClickListener() {
public void onClick(View v) {
if(btn == software_catalog)
software_catalog.setEnabled(false);
else
software_catalog.setEnabled(true);
if(btn == software_recommend)
software_recommend.setEnabled(false);
else
software_recommend.setEnabled(true);
if(btn == software_lastest)
software_lastest.setEnabled(false);
else
software_lastest.setEnabled(true);
if(btn == software_hot)
software_hot.setEnabled(false);
else
software_hot.setEnabled(true);
if(btn == software_china)
software_china.setEnabled(false);
else
software_china.setEnabled(true);
curHeadTag = tag;
if(btn == software_catalog)
{
curScreen = SCREEN_CATALOG;
if(lvSoftwareCatalogData.size() == 0)
loadLvSoftwareCatalogData(0, mSoftwareCatalogHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
else
{
curScreen = SCREEN_SOFTWARE;
loadLvSoftwareData(tag, 0, mSoftwareHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);
}
mTitle.setText(title);
mScrollLayout.setToScreen(curScreen);
}
};
}
/**
* 线程加载软件分类列表数据
* @param tag 第一级:0 第二级:tag
* @param handler 处理器
* @param action 动作标识
*/
private void loadLvSoftwareCatalogData(final int tag,final Handler handler,final int action){
headButtonSwitch(DATA_LOAD_ING);
new Thread(){
public void run() {
Message msg = new Message();
try {
SoftwareCatalogList softwareCatalogList = ((AppContext)getApplication()).getSoftwareCatalogList(tag);
msg.what = softwareCatalogList.getSoftwareTypelist().size();
msg.obj = softwareCatalogList;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;//告知handler当前action
handler.sendMessage(msg);
}
}.start();
}
/**
* 线程加载软件分类二级列表数据
* @param tag 第一级:0 第二级:tag
* @param handler 处理器
* @param action 动作标识
*/
private void loadLvSoftwareTagData(final int searchTag,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 {
SoftwareList softwareList = ((AppContext)getApplication()).getSoftwareTagList(searchTag, pageIndex, isRefresh);
msg.what = softwareList.getSoftwarelist().size();
msg.obj = softwareList;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;//告知handler当前action
handler.sendMessage(msg);
}
}.start();
}
/**
* 线程加载软件列表数据
* @param searchTag 软件分类 推荐:recommend 最新:time 热门:view 国产:list_cn
* @param pageIndex 当前页数
* @param handler 处理器
* @param action 动作标识
*/
private void loadLvSoftwareData(final int tag,final int pageIndex,final Handler handler,final int action){
String _searchTag = "";
switch (tag) {
case HEAD_TAG_RECOMMEND:
_searchTag = SoftwareList.TAG_RECOMMEND;
break;
case HEAD_TAG_LASTEST:
_searchTag = SoftwareList.TAG_LASTEST;
break;
case HEAD_TAG_HOT:
_searchTag = SoftwareList.TAG_HOT;
break;
case HEAD_TAG_CHINA:
_searchTag = SoftwareList.TAG_CHINA;
break;
}
if(StringUtils.isEmpty(_searchTag)) return;
final String searchTag = _searchTag;
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 {
SoftwareList softwareList = ((AppContext)getApplication()).getSoftwareList(searchTag, pageIndex, isRefresh);
msg.what = softwareList.getPageSize();
msg.obj = softwareList;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;//告知handler当前action
if(curHeadTag == tag)
handler.sendMessage(msg);
}
}.start();
}
/**
* 返回事件
*/
private void back() {
if(curHeadTag == HEAD_TAG_CATALOG) {
switch (curScreen) {
case SCREEN_SOFTWARE:
mTitle.setText(curTitleLV1);
curScreen = SCREEN_TAG;
mScrollLayout.scrollToScreen(SCREEN_TAG);
break;
case SCREEN_TAG:
mTitle.setText("开源软件库");
curScreen = SCREEN_CATALOG;
mScrollLayout.scrollToScreen(SCREEN_CATALOG);
break;
case SCREEN_CATALOG:
finish();
break;
}
}else{
finish();
}
}
private View.OnClickListener backClickListener = new View.OnClickListener(){
public void onClick(View v) {
back();
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
back();
return true;
}
return false;
}
}