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.ListViewQuestionAdapter; import net.oschina.app.bean.Notice; import net.oschina.app.bean.Post; import net.oschina.app.bean.PostList; import net.oschina.app.common.StringUtils; 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.ImageView; import android.widget.ProgressBar; import android.widget.TextView; /** * Tag相关帖子列表 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-8-27 */ public class QuestionTag extends BaseActivity{ private ImageView mHome; private TextView mHeadTitle; private ProgressBar mProgressbar; private PullToRefreshListView lvQuestion; private ListViewQuestionAdapter lvQuestionAdapter; private List<Post> lvQuestionData = new ArrayList<Post>(); private View lvQuestion_footer; private TextView lvQuestion_foot_more; private ProgressBar lvQuestion_foot_progress; private Handler lvQuestionHandler; private int lvQuestionSumData; private final static int DATA_LOAD_ING = 0x001; private final static int DATA_LOAD_COMPLETE = 0x002; private final static int DATA_LOAD_FAIL = 0x003; private String curTag; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.question_tag); //初始化视图控件 initView(); //初始化控件数据 initData(); } //初始化视图控件 private void initView(){ curTag = getIntent().getStringExtra("post_tag"); mHome = (ImageView)findViewById(R.id.question_tag_home); mHeadTitle = (TextView)findViewById(R.id.question_tag_head_title); mProgressbar = (ProgressBar)findViewById(R.id.question_tag_head_progress); mHome.setOnClickListener(homeClickListener); mHeadTitle.setText(curTag); lvQuestionAdapter = new ListViewQuestionAdapter(this, lvQuestionData, R.layout.question_listitem); lvQuestion_footer = getLayoutInflater().inflate(R.layout.listview_footer, null); lvQuestion_foot_more = (TextView)lvQuestion_footer.findViewById(R.id.listview_foot_more); lvQuestion_foot_progress = (ProgressBar)lvQuestion_footer.findViewById(R.id.listview_foot_progress); lvQuestion = (PullToRefreshListView)findViewById(R.id.question_tag_listview); lvQuestion.addFooterView(lvQuestion_footer);//添加底部视图 必须在setAdapter前 lvQuestion.setAdapter(lvQuestionAdapter); lvQuestion.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //点击头部、底部栏无效 if(position == 0 || view == lvQuestion_footer) return; Post post = null; //判断是否是TextView if(view instanceof TextView){ post = (Post)view.getTag(); }else{ TextView tv = (TextView)view.findViewById(R.id.question_listitem_title); post = (Post)tv.getTag(); } if(post == null) return; //跳转到问答详情 UIHelper.showQuestionDetail(view.getContext(), post.getId()); } }); lvQuestion.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { lvQuestion.onScrollStateChanged(view, scrollState); //数据为空--不用继续下面代码了 if(lvQuestionData.size() == 0) return; //判断是否滚动到底部 boolean scrollEnd = false; try { if(view.getPositionForView(lvQuestion_footer) == view.getLastVisiblePosition()) scrollEnd = true; } catch (Exception e) { scrollEnd = false; } int lvDataState = StringUtils.toInt(lvQuestion.getTag()); if(scrollEnd && lvDataState==UIHelper.LISTVIEW_DATA_MORE) { lvQuestion.setTag(UIHelper.LISTVIEW_DATA_LOADING); lvQuestion_foot_more.setText(R.string.load_ing); lvQuestion_foot_progress.setVisibility(View.VISIBLE); //当前pageIndex int pageIndex = lvQuestionSumData/AppContext.PAGE_SIZE; loadLvQuestionData(curTag, pageIndex, lvQuestionHandler, UIHelper.LISTVIEW_ACTION_SCROLL); } } public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { lvQuestion.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } }); lvQuestion.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() { public void onRefresh() { loadLvQuestionData(curTag, 0, lvQuestionHandler, UIHelper.LISTVIEW_ACTION_REFRESH); } }); } //初始化控件数据 private void initData(){ lvQuestionHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what >= 0){ headButtonSwitch(DATA_LOAD_COMPLETE); PostList list = (PostList)msg.obj; Notice notice = list.getNotice(); //处理listview数据 switch (msg.arg1) { case UIHelper.LISTVIEW_ACTION_INIT: case UIHelper.LISTVIEW_ACTION_REFRESH: lvQuestionSumData = msg.what; lvQuestionData.clear();//先清除原有数据 lvQuestionData.addAll(list.getPostlist()); break; case UIHelper.LISTVIEW_ACTION_SCROLL: lvQuestionSumData += msg.what; if(lvQuestionData.size() > 0){ for(Post p1 : list.getPostlist()){ boolean b = false; for(Post p2 : lvQuestionData){ if(p1.getId() == p2.getId() && p1.getAuthorId() == p2.getAuthorId()){ b = true; break; } } if(!b) lvQuestionData.add(p1); } }else{ lvQuestionData.addAll(list.getPostlist()); } break; } if(msg.what < 20){ lvQuestion.setTag(UIHelper.LISTVIEW_DATA_FULL); lvQuestionAdapter.notifyDataSetChanged(); lvQuestion_foot_more.setText(R.string.load_full); }else if(msg.what == 20){ lvQuestion.setTag(UIHelper.LISTVIEW_DATA_MORE); lvQuestionAdapter.notifyDataSetChanged(); lvQuestion_foot_more.setText(R.string.load_more); } //发送通知广播 if(notice != null){ UIHelper.sendBroadCast(QuestionTag.this, notice); } } else if(msg.what == -1){ headButtonSwitch(DATA_LOAD_FAIL); //有异常--显示加载出错 & 弹出错误消息 lvQuestion.setTag(UIHelper.LISTVIEW_DATA_MORE); lvQuestion_foot_more.setText(R.string.load_error); ((AppException)msg.obj).makeToast(QuestionTag.this); } if(lvQuestionData.size()==0){ lvQuestion.setTag(UIHelper.LISTVIEW_DATA_EMPTY); lvQuestion_foot_more.setText(R.string.load_empty); } lvQuestion_foot_progress.setVisibility(View.GONE); if(msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH){ lvQuestion.onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString()); lvQuestion.setSelection(0); } } }; this.loadLvQuestionData(curTag, 0, lvQuestionHandler, UIHelper.LISTVIEW_ACTION_INIT); } /** * 线程加载问答列表数据 * @param tag 当前Tag * @param pageIndex 当前页数 * @param handler 处理器 * @param action 动作标识 */ private void loadLvQuestionData(final String tag, 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 { PostList list = ((AppContext)getApplication()).getPostListByTag(tag, pageIndex, isRefresh); msg.what = list.getPageSize(); msg.obj = list; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } msg.arg1 = action;//告知handler当前action handler.sendMessage(msg); } }.start(); } /** * 头部加载动画展示 * @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; case DATA_LOAD_FAIL: mProgressbar.setVisibility(View.GONE); break; } } private View.OnClickListener homeClickListener = new View.OnClickListener() { public void onClick(View v) { UIHelper.showHome(QuestionTag.this); } }; }