package com.noprom.app.fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.noprom.app.AppContext;
import com.noprom.app.AppException;
import com.noprom.app.R;
import com.noprom.app.adapter.ListViewNewsAdapter;
import com.noprom.app.bean.News;
import com.noprom.app.bean.NewsList;
import com.noprom.app.bean.Notice;
import com.noprom.app.common.StringUtils;
import com.noprom.app.common.UIHelper;
import com.noprom.app.widget.PullToRefreshListView;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 综合Tab 新闻资讯Fragment
*
* @author noprom (http://github.com/noprom)
* @version 1.0
* Created by noprom on 2014-2-25.
*/
public class NewsFragment extends Fragment {
private final String TAG = "NewsFragment";
private ListViewNewsAdapter lvNewsAdapter;
private List<News> lvNewsData = new ArrayList<News>();
private Handler lvNewsHandler;
private PullToRefreshListView lvNews;
private View lvNews_footer;
private TextView lvNews_foot_more;
private ProgressBar lvNews_foot_progress;
private LinearLayout lvNews_root;
private int lvNewsSumData;
private int curNewsCatalog = NewsList.CATALOG_ALL;
private AppContext appContext;// 全局Context
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
lvNews_root = (LinearLayout) inflater.inflate(R.layout.fragment_news, container, false);
lvNewsAdapter = new ListViewNewsAdapter(getActivity(), lvNewsData,
R.layout.news_listitem);
lvNews_footer = inflater.inflate(R.layout.listview_footer,
null);
lvNews_foot_more = (TextView) lvNews_footer
.findViewById(R.id.listview_foot_more);
lvNews_foot_progress = (ProgressBar) lvNews_footer
.findViewById(R.id.listview_foot_progress);
lvNews = (PullToRefreshListView) lvNews_root.findViewById(R.id.listview_news);
lvNews.addFooterView(lvNews_footer);// 添加底部视图 必须在setAdapter前
lvNews.setAdapter(lvNewsAdapter);
// 每一项的点击事件
lvNews.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 点击头部、底部栏无效
if (position == 0 || view == lvNews_footer)
return;
News news = null;
// 判断是否是TextView
if (view instanceof TextView) {
news = (News) view.getTag();
} else {
TextView tv = (TextView) view
.findViewById(R.id.news_listitem_title);
news = (News) tv.getTag();
}
if (news == null)
return;
// 跳转到新闻详情
UIHelper.showNewsRedirect(view.getContext(), news);
}
});
lvNews.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
lvNews.onScrollStateChanged(view, scrollState);
// 数据为空--不用继续下面代码了
if (lvNewsData.isEmpty())
return;
// 判断是否滚动到底部
boolean scrollEnd = false;
try {
if (view.getPositionForView(lvNews_footer) == view
.getLastVisiblePosition())
scrollEnd = true;
} catch (Exception e) {
scrollEnd = false;
}
int lvDataState = StringUtils.toInt(lvNews.getTag());
if (scrollEnd && lvDataState == UIHelper.LISTVIEW_DATA_MORE) {
lvNews.setTag(UIHelper.LISTVIEW_DATA_LOADING);
lvNews_foot_more.setText(R.string.load_ing);
lvNews_foot_progress.setVisibility(View.VISIBLE);
// 当前pageIndex
int pageIndex = lvNewsSumData / AppContext.PAGE_SIZE;
loadLvNewsData(curNewsCatalog, pageIndex, lvNewsHandler,
UIHelper.LISTVIEW_ACTION_SCROLL);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
lvNews.onScroll(view, firstVisibleItem, visibleItemCount,
totalItemCount);
}
});
lvNews.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
public void onRefresh() {
loadLvNewsData(curNewsCatalog, 0, lvNewsHandler,
UIHelper.LISTVIEW_ACTION_REFRESH);
}
});
appContext = (AppContext) getActivity().getApplication();
this.initNewsListData();
return lvNews_root;
}
/**
* 初始化新闻资讯ListView数据
*/
private void initNewsListData() {
// 初始化Handler
lvNewsHandler = this.getLvHandler(lvNews, lvNewsAdapter,
lvNews_foot_more, lvNews_foot_progress, AppContext.PAGE_SIZE);
// 加载资讯数据
if (lvNewsData.isEmpty()) {
loadLvNewsData(curNewsCatalog, 0, lvNewsHandler,
UIHelper.LISTVIEW_ACTION_INIT);
}
}
/**
* 获取listview的初始化Handler
*
* @param lv
* @param adapter
* @return
*/
private Handler getLvHandler(final PullToRefreshListView lv,
final BaseAdapter adapter, final TextView more,
final ProgressBar progress, final int pageSize) {
return new Handler() {
public void handleMessage(Message msg) {
if (msg.what >= 0) {
// listview数据处理
Notice notice = handleLvData(msg.what, msg.obj, msg.arg2,
msg.arg1);
if (msg.what < pageSize) {
lv.setTag(UIHelper.LISTVIEW_DATA_FULL);
adapter.notifyDataSetChanged();
more.setText(R.string.load_full);
} else if (msg.what == pageSize) {
lv.setTag(UIHelper.LISTVIEW_DATA_MORE);
adapter.notifyDataSetChanged();
more.setText(R.string.load_more);
// 特殊处理-热门动弹不能翻页
// if (lv == lvTweet) {
// TweetList tlist = (TweetList) msg.obj;
// if (lvTweetData.size() == tlist.getTweetCount()) {
// lv.setTag(UIHelper.LISTVIEW_DATA_FULL);
// more.setText(R.string.load_full);
// }
// }
}
// 发送通知广播
if (notice != null) {
UIHelper.sendBroadCast(lv.getContext(), notice);
}
// 是否清除通知信息
// if (isClearNotice) {
// ClearNotice(curClearNoticeType);
// isClearNotice = false;// 重置
// curClearNoticeType = 0;
// }
} else if (msg.what == -1) {
// 有异常--显示加载出错 & 弹出错误消息
lv.setTag(UIHelper.LISTVIEW_DATA_MORE);
more.setText(R.string.load_error);
// ((AppException) msg.obj).makeToast(MainActivity.this);
}
if (adapter.getCount() == 0) {
lv.setTag(UIHelper.LISTVIEW_DATA_EMPTY);
more.setText(R.string.load_empty);
}
progress.setVisibility(ProgressBar.GONE);
// mHeadProgress.setVisibility(ProgressBar.GONE);
if (msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH) {
lv.onRefreshComplete(getString(R.string.pull_to_refresh_update)
+ new Date().toLocaleString());
lv.setSelection(0);
} else if (msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG) {
lv.onRefreshComplete();
lv.setSelection(0);
}
}
};
}
/**
* 线程加载新闻数据
*
* @param catalog
* 分类
* @param pageIndex
* 当前页数
* @param handler
* 处理器
* @param action
* 动作标识
*/
private void loadLvNewsData(final int catalog, final int pageIndex,
final Handler handler, final int action) {
// mHeadProgress.setVisibility(ProgressBar.VISIBLE);
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 {
NewsList list = appContext.getNewsList(catalog, pageIndex,
isRefresh);
msg.what = list.getPageSize();
msg.obj = list;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
msg.arg1 = action;
msg.arg2 = UIHelper.LISTVIEW_DATATYPE_NEWS;
if (curNewsCatalog == catalog)
handler.sendMessage(msg);
}
}.start();
}
/**
* listview数据处理
*
* @param what 数量
* @param obj 数据
* @param objtype 数据类型
* @param actiontype 操作类型
* @return notice 通知信息
*/
private Notice handleLvData(int what, Object obj, int objtype,
int actiontype) {
Notice notice = null;
switch (actiontype) {
case UIHelper.LISTVIEW_ACTION_INIT:
case UIHelper.LISTVIEW_ACTION_REFRESH:
case UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG:
int newdata = 0;// 新加载数据-只有刷新动作才会使用到
switch (objtype) {
case UIHelper.LISTVIEW_DATATYPE_NEWS:
NewsList nlist = (NewsList) obj;
notice = nlist.getNotice();
lvNewsSumData = what;
if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
if (lvNewsData.size() > 0) {
for (News news1 : nlist.getNewslist()) {
boolean b = false;
for (News news2 : lvNewsData) {
if (news1.getId() == news2.getId()) {
b = true;
break;
}
}
if (!b)
newdata++;
}
} else {
newdata = what;
}
}
lvNewsData.clear();// 先清除原有数据
lvNewsData.addAll(nlist.getNewslist());
break;
// case UIHelper.LISTVIEW_DATATYPE_BLOG:
// BlogList blist = (BlogList) obj;
// notice = blist.getNotice();
// lvBlogSumData = what;
// if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// if (lvBlogData.size() > 0) {
// for (Blog blog1 : blist.getBloglist()) {
// boolean b = false;
// for (Blog blog2 : lvBlogData) {
// if (blog1.getId() == blog2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// newdata++;
// }
// } else {
// newdata = what;
// }
// }
// lvBlogData.clear();// 先清除原有数据
// lvBlogData.addAll(blist.getBloglist());
// break;
// case UIHelper.LISTVIEW_DATATYPE_POST:
// PostList plist = (PostList) obj;
// notice = plist.getNotice();
// lvQuestionSumData = what;
// if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// if (lvQuestionData.size() > 0) {
// for (Post post1 : plist.getPostlist()) {
// boolean b = false;
// for (Post post2 : lvQuestionData) {
// if (post1.getId() == post2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// newdata++;
// }
// } else {
// newdata = what;
// }
// }
// lvQuestionData.clear();// 先清除原有数据
// lvQuestionData.addAll(plist.getPostlist());
// break;
// case UIHelper.LISTVIEW_DATATYPE_TWEET:
// TweetList tlist = (TweetList) obj;
// notice = tlist.getNotice();
// lvTweetSumData = what;
// if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// if (lvTweetData.size() > 0) {
// for (Tweet tweet1 : tlist.getTweetlist()) {
// boolean b = false;
// for (Tweet tweet2 : lvTweetData) {
// if (tweet1.getId() == tweet2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// newdata++;
// }
// } else {
// newdata = what;
// }
// }
// lvTweetData.clear();// 先清除原有数据
// lvTweetData.addAll(tlist.getTweetlist());
// break;
// case UIHelper.LISTVIEW_DATATYPE_ACTIVE:
// ActiveList alist = (ActiveList) obj;
// notice = alist.getNotice();
// lvActiveSumData = what;
// if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// if (lvActiveData.size() > 0) {
// for (Active active1 : alist.getActivelist()) {
// boolean b = false;
// for (Active active2 : lvActiveData) {
// if (active1.getId() == active2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// newdata++;
// }
// } else {
// newdata = what;
// }
// }
// lvActiveData.clear();// 先清除原有数据
// lvActiveData.addAll(alist.getActivelist());
// break;
// case UIHelper.LISTVIEW_DATATYPE_MESSAGE:
// MessageList mlist = (MessageList) obj;
// notice = mlist.getNotice();
// lvMsgSumData = what;
// if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// if (lvMsgData.size() > 0) {
// for (Messages msg1 : mlist.getMessagelist()) {
// boolean b = false;
// for (Messages msg2 : lvMsgData) {
// if (msg1.getId() == msg2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// newdata++;
// }
// } else {
// newdata = what;
// }
// }
// lvMsgData.clear();// 先清除原有数据
// lvMsgData.addAll(mlist.getMessagelist());
// break;
}
if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) {
// 提示新加载数据
// if (newdata > 0) {
// NewDataToast
// .makeText(
// this,
// getString(R.string.new_data_toast_message,
// newdata), appContext.isAppSound())
// .show();
// } else {
// NewDataToast.makeText(this,
// getString(R.string.new_data_toast_none), false)
// .show();
// }
}
break;
case UIHelper.LISTVIEW_ACTION_SCROLL:
switch (objtype) {
case UIHelper.LISTVIEW_DATATYPE_NEWS:
NewsList list = (NewsList) obj;
notice = list.getNotice();
lvNewsSumData += what;
if (lvNewsData.size() > 0) {
for (News news1 : list.getNewslist()) {
boolean b = false;
for (News news2 : lvNewsData) {
if (news1.getId() == news2.getId()) {
b = true;
break;
}
}
if (!b)
lvNewsData.add(news1);
}
} else {
lvNewsData.addAll(list.getNewslist());
}
break;
// case UIHelper.LISTVIEW_DATATYPE_BLOG:
// BlogList blist = (BlogList) obj;
// notice = blist.getNotice();
// lvBlogSumData += what;
// if (lvBlogData.size() > 0) {
// for (Blog blog1 : blist.getBloglist()) {
// boolean b = false;
// for (Blog blog2 : lvBlogData) {
// if (blog1.getId() == blog2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// lvBlogData.add(blog1);
// }
// } else {
// lvBlogData.addAll(blist.getBloglist());
// }
// break;
// case UIHelper.LISTVIEW_DATATYPE_POST:
// PostList plist = (PostList) obj;
// notice = plist.getNotice();
// lvQuestionSumData += what;
// if (lvQuestionData.size() > 0) {
// for (Post post1 : plist.getPostlist()) {
// boolean b = false;
// for (Post post2 : lvQuestionData) {
// if (post1.getId() == post2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// lvQuestionData.add(post1);
// }
// } else {
// lvQuestionData.addAll(plist.getPostlist());
// }
// break;
// case UIHelper.LISTVIEW_DATATYPE_TWEET:
// TweetList tlist = (TweetList) obj;
// notice = tlist.getNotice();
// lvTweetSumData += what;
// if (lvTweetData.size() > 0) {
// for (Tweet tweet1 : tlist.getTweetlist()) {
// boolean b = false;
// for (Tweet tweet2 : lvTweetData) {
// if (tweet1.getId() == tweet2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// lvTweetData.add(tweet1);
// }
// } else {
// lvTweetData.addAll(tlist.getTweetlist());
// }
// break;
// case UIHelper.LISTVIEW_DATATYPE_ACTIVE:
// ActiveList alist = (ActiveList) obj;
// notice = alist.getNotice();
// lvActiveSumData += what;
// if (lvActiveData.size() > 0) {
// for (Active active1 : alist.getActivelist()) {
// boolean b = false;
// for (Active active2 : lvActiveData) {
// if (active1.getId() == active2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// lvActiveData.add(active1);
// }
// } else {
// lvActiveData.addAll(alist.getActivelist());
// }
// break;
// case UIHelper.LISTVIEW_DATATYPE_MESSAGE:
// MessageList mlist = (MessageList) obj;
// notice = mlist.getNotice();
// lvMsgSumData += what;
// if (lvMsgData.size() > 0) {
// for (Messages msg1 : mlist.getMessagelist()) {
// boolean b = false;
// for (Messages msg2 : lvMsgData) {
// if (msg1.getId() == msg2.getId()) {
// b = true;
// break;
// }
// }
// if (!b)
// lvMsgData.add(msg1);
// }
// } else {
// lvMsgData.addAll(mlist.getMessagelist());
// }
// break;
}
break;
}
return notice;
}
}