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 android.widget.Toast; import com.noprom.app.AppContext; import com.noprom.app.AppException; import com.noprom.app.R; import com.noprom.app.adapter.ListViewBlogAdapter; import com.noprom.app.bean.Blog; import com.noprom.app.bean.BlogList; 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 BlogFragment extends Fragment { private final String TAG = "BlogFragment"; private ListViewBlogAdapter lvBlogAdapter; private List<Blog> lvBlogData = new ArrayList<Blog>(); private Handler lvBlogHandler; private PullToRefreshListView lvBlog; private View lvBlog_footer; private TextView lvBlog_foot_more; private ProgressBar lvBlog_foot_progress; private LinearLayout lvBlog_root; private int lvBlogSumData; private int curNewsCatalog = NewsList.CATALOG_ALL; private AppContext appContext;// 全局Context @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); lvBlog_root = (LinearLayout) inflater.inflate(R.layout.fragment_blog, container, false); lvBlogAdapter = new ListViewBlogAdapter(getActivity(), BlogList.CATALOG_LATEST, lvBlogData, R.layout.blog_listitem); lvBlog_footer = inflater.inflate(R.layout.listview_footer, null); lvBlog_foot_more = (TextView) lvBlog_footer .findViewById(R.id.listview_foot_more); lvBlog_foot_progress = (ProgressBar) lvBlog_footer .findViewById(R.id.listview_foot_progress); lvBlog = (PullToRefreshListView) lvBlog_root.findViewById(R.id.listview_blog); lvBlog.addFooterView(lvBlog_footer);// 添加底部视图 必须在setAdapter前 lvBlog.setAdapter(lvBlogAdapter); lvBlog.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击头部、底部栏无效 if (position == 0 || view == lvBlog_footer) return; Blog blog = null; // 判断是否是TextView if (view instanceof TextView) { blog = (Blog) view.getTag(); } else { TextView tv = (TextView) view .findViewById(R.id.blog_listitem_title); blog = (Blog) tv.getTag(); } if (blog == null) return; // 跳转到博客详情 Toast.makeText(getActivity(), "View = " + view + ",position = " + position + ",id = " + id, Toast.LENGTH_LONG).show(); // UIHelper.showUrlRedirect(view.getContext(), blog.getUrl()); } }); lvBlog.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { lvBlog.onScrollStateChanged(view, scrollState); // 数据为空--不用继续下面代码了 if (lvBlogData.isEmpty()) return; // 判断是否滚动到底部 boolean scrollEnd = false; try { if (view.getPositionForView(lvBlog_footer) == view .getLastVisiblePosition()) scrollEnd = true; } catch (Exception e) { scrollEnd = false; } int lvDataState = StringUtils.toInt(lvBlog.getTag()); if (scrollEnd && lvDataState == UIHelper.LISTVIEW_DATA_MORE) { lvBlog.setTag(UIHelper.LISTVIEW_DATA_LOADING); lvBlog_foot_more.setText(R.string.load_ing); lvBlog_foot_progress.setVisibility(View.VISIBLE); // 当前pageIndex int pageIndex = lvBlogSumData / AppContext.PAGE_SIZE; loadLvBlogData(curNewsCatalog, pageIndex, lvBlogHandler, UIHelper.LISTVIEW_ACTION_SCROLL); } } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lvBlog.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } }); lvBlog.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() { public void onRefresh() { loadLvBlogData(curNewsCatalog, 0, lvBlogHandler, UIHelper.LISTVIEW_ACTION_REFRESH); } }); appContext = (AppContext) getActivity().getApplication(); this.initBlogListData(); return lvBlog_root; } /** * 初始化博客 ListView数据 */ private void initBlogListData() { // 初始化Handler lvBlogHandler = this.getLvHandler(lvBlog, lvBlogAdapter, lvBlog_foot_more, lvBlog_foot_progress, AppContext.PAGE_SIZE); // 加载资讯数据 if (lvBlogData.isEmpty()) { loadLvBlogData(curNewsCatalog, 0, lvBlogHandler, 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 loadLvBlogData(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; String type = ""; switch (catalog) { case BlogList.CATALOG_LATEST: type = BlogList.TYPE_LATEST; break; case BlogList.CATALOG_RECOMMEND: type = BlogList.TYPE_RECOMMEND; break; } try { BlogList list = appContext.getBlogList(type, 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_BLOG; 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(); // lvBlogSumData = what; // if (actiontype == UIHelper.LISTVIEW_ACTION_REFRESH) { // if (lvBlogData.size() > 0) { // for (News news1 : nlist.getNewslist()) { // boolean b = false; // for (News news2 : lvBlogData) { // if (news1.getId() == news2.getId()) { // b = true; // break; // } // } // if (!b) // newdata++; // } // } else { // newdata = what; // } // } // lvBlogData.clear();// 先清除原有数据 // lvBlogData.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(); // lvBlogSumData += what; // if (lvBlogData.size() > 0) { // for (News news1 : list.getNewslist()) { // boolean b = false; // for (News news2 : lvBlogData) { // if (news1.getId() == news2.getId()) { // b = true; // break; // } // } // if (!b) // lvBlogData.add(news1); // } // } else { // lvBlogData.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; } }