package com.gnod.geekr.ui.activity; import java.util.ArrayList; import android.content.Intent; import android.os.Bundle; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.OnNavigationListener; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gnod.geekr.R; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.app.adapter.SpinnerAdapter; import com.gnod.geekr.model.CommentModel; import com.gnod.geekr.model.UserInfoModel; import com.gnod.geekr.tool.DateUtils; import com.gnod.geekr.tool.LaunchHelper; import com.gnod.geekr.tool.WeiboBaseTool; import com.gnod.geekr.tool.StringUtils; import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener; import com.gnod.geekr.tool.fetcher.CommentFetcher; import com.gnod.geekr.tool.fetcher.NoticeFetcher; import com.gnod.geekr.tool.manager.DrawableManager; import com.gnod.geekr.tool.manager.StatusManager; import com.gnod.geekr.tool.manager.Utils; import com.gnod.geekr.weibo.api.RemindAPI.UNREAD_TYPE; import com.gnod.geekr.widget.AvatarView; import com.gnod.geekr.widget.ColorToast; import com.gnod.geekr.widget.ColorToast.ToastColor; public class CommentsActivity extends BaseActivity { private ListView mListView; private CommentFetcher mFetcher; private ArrayList<CommentModel> mList = new ArrayList<CommentModel>(); private DrawableManager mDrawableMgr; private ColorToast mTopToastView; private ColorToast mBottomToastView; private int mSelectedType = 0; private MenuItem mRefresh; private boolean isAllLoaded; private SpinnerAdapter mSpinAdapter; private String[] mSpinArrays = { "所有评论", "发出评论", "收到评论", "@我评论" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_comments); mDrawableMgr = AppConfig.getDrawableManager(); initView(); bindListener(); bindView(); } @Override protected void onResume() { super.onResume(); AppConfig.sImageFetcher.setExitTasksEarly(false); } @Override protected void onPause() { super.onPause(); AppConfig.sImageFetcher.setPauseWork(false); AppConfig.sImageFetcher.setExitTasksEarly(true); AppConfig.sImageFetcher.flushCache(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_refresh, menu); mRefresh = menu.findItem(R.id.menu_refresh); setRefreshing(true); fetchComments(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_refresh: setRefreshing(true); isAllLoaded = false; fetchComments(); return true; } return super.onOptionsItemSelected(item); } /** * init 之前必须确保appConfig必须已经初始化. */ private void initView() { mListView = (ListView) findViewById(R.id.view_comment_list); mTopToastView = (ColorToast) findViewById(R.id.view_comments_toast_top); mBottomToastView = (ColorToast) findViewById(R.id.view_comments_toast_bottom); mListView.setAdapter(listAdapter); } private void bindListener() { mListView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean lastViewVisible = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_FLING) { if (!Utils.hasHoneycomb()) { AppConfig.sImageFetcher.setPauseWork(true); } } else { AppConfig.sImageFetcher.setPauseWork(false); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (mList.size() == 0) return; if (firstVisibleItem + visibleItemCount >= totalItemCount && !lastViewVisible) { lastViewVisible = true; if (isAllLoaded == false && mRefresh.getActionView() == null) { setRefreshing(true); long maxId = Long.parseLong(mList.get(mList.size() - 1).ID); fetchComments(0, maxId, 20); } } else if (firstVisibleItem + visibleItemCount < totalItemCount) { lastViewVisible = false; } } }); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ItemView itemView = (ItemView) view.getTag(); if (itemView == null || position > mList.size()) return; CommentModel item = mList.get(position); Intent intent = new Intent(view.getContext(), PostStatusActivity.class); intent.putExtra("Type", "replyComment"); intent.putExtra("CommentID", item.ID); intent.putExtra("StatusID", item.statusID); startActivity(intent); } }); } private void bindView() { mFetcher = new CommentFetcher(); mSpinAdapter = new SpinnerAdapter(this, mSpinArrays); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); getSupportActionBar().setListNavigationCallbacks(mSpinAdapter, new OnNavigationListener() { @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { if (itemPosition == mSelectedType) return true; mSelectedType = itemPosition; setRefreshing(true); fetchComments(); return true; } }); Bundle extras = getIntent().getExtras(); if (extras != null) { mSelectedType = extras.getInt("Type", 0); getSupportActionBar().setSelectedNavigationItem(mSelectedType); if (mSelectedType == 2) WeiboBaseTool.getInstance().resetUnRead(UNREAD_TYPE.CMT, null); else if (mSelectedType == 3) WeiboBaseTool.getInstance().resetUnRead( UNREAD_TYPE.MENTION_CMT, null); } } private void setRefreshing(boolean checked) { if (mRefresh != null) { if (checked) mRefresh.setActionView(R.layout.layout_loading); else mRefresh.setActionView(null); } } public void fetchComments() { fetchComments(0, 0, 10); } public void fetchComments(long sinceId, long maxId, int count) { mFetcher.fetchComments(sinceId, maxId, count, mSelectedType, new OnFetchListener(mSelectedType)); } private class OnFetchListener implements FetchCompleteListener { private int type = 0; public OnFetchListener(int type) { this.type = type; } @Override public void fetchComplete(int state, int code, Object obj) { setRefreshing(false); if (type != mSelectedType) return; switch (state) { case NoticeFetcher.FETCH_NOT_NETWORK: case NoticeFetcher.FETCH_AUTH_FAILED: mTopToastView.show((String) obj, ToastColor.RED); break; case NoticeFetcher.FETCH_EMPTY: break; case NoticeFetcher.FETCH_FAILED: break; case NoticeFetcher.FETCH_SUCCEED_NEWS: case NoticeFetcher.FETCH_SUCCEED_MORE: ArrayList<CommentModel> resultList = (ArrayList<CommentModel>) obj; if (resultList.size() > 1) { if (state == NoticeFetcher.FETCH_SUCCEED_NEWS) { mTopToastView.show("更新" + resultList.size() + "条新消息", ToastColor.BLUE); mList.clear(); mList.addAll(resultList); } else if (state == NoticeFetcher.FETCH_SUCCEED_MORE) { mBottomToastView.show( "更新" + resultList.size() + "条新消息", ToastColor.BLUE); // 由于more时,根据当前最后一条id进行fetch,结果中第一条与当前最后一条 // 出现重复,需除去一个重复item int lastIndex = mList.size() - 1; mList.remove(lastIndex); mList.addAll(resultList); } listAdapter.notifyDataSetChanged(); if (state == NoticeFetcher.FETCH_SUCCEED_NEWS) mListView.setSelection(0); } if (resultList.size() < 5) { isAllLoaded = true; } break; } } }; private BaseAdapter listAdapter = new BaseAdapter() { @Override public View getView(int position, View view, ViewGroup parent) { ItemView item; if (view == null) { LayoutInflater inflater = LayoutInflater .from(CommentsActivity.this); view = inflater.inflate(R.layout.listitem_comments, null); item = new ItemView(); item.imageAvatar = (AvatarView) view .findViewById(R.id.layout_met_item_avatar); item.imageVerified = (ImageView) view .findViewById(R.id.layout_met_item_verified_image); item.textName = (TextView) view .findViewById(R.id.layout_met_item_name); item.textContent = (TextView) view .findViewById(R.id.layout_met_item_content); item.textSource = (TextView) view .findViewById(R.id.layout_met_item_from); item.layoutRetweet = view .findViewById(R.id.layout_met_item_retweet); item.textRetweetContent = (TextView) view .findViewById(R.id.layout_met_item_retweet_content); item.textTime = (TextView) view .findViewById(R.id.layout_met_item_time); view.setTag(item); item.layoutRetweet.setOnClickListener(retweetClickListener); } else { item = (ItemView) view.getTag(); } CommentModel model = mList.get(position); UserInfoModel userInfo = model.userInfo; if (item == null && userInfo == null) return null; item.imageAvatar.setItem(userInfo); // item.imageAvatar.setImageResource(R.drawable.avatar_default); // mDrawableMgr.loadBitmap(userInfo.iconURL, item.imageAvatar, // true); AppConfig.sImageFetcher.loadImage(userInfo.iconURL, item.imageAvatar, R.drawable.avatar_default); item.textName.setText(userInfo.nickName); if (userInfo.verifiedType == 3 || userInfo.verifiedType == 2 || userInfo.verifiedType == 7) { item.imageVerified.setVisibility(View.VISIBLE); item.imageVerified .setImageResource(R.drawable.ic_verified_blue); } else if (userInfo.verifiedType == 220) { item.imageVerified.setVisibility(View.VISIBLE); item.imageVerified.setImageResource(R.drawable.ic_daren); } else if (userInfo.verifiedType == 0) { item.imageVerified.setVisibility(View.VISIBLE); item.imageVerified.setImageResource(R.drawable.ic_verified); } else { item.imageVerified.setVisibility(View.GONE); } item.textContent.setText(model.content); item.layoutRetweet.setTag(model); if (model.replyComment == null && model.status == null) { item.layoutRetweet.setVisibility(View.GONE); } else if (model.replyComment != null) { item.layoutRetweet.setVisibility(View.VISIBLE); String content = ""; if (model.replyComment.userInfo != null) ; content = "回复 @" + model.replyComment.userInfo.nickName + " 的评论: "; content += model.replyComment.content; item.textRetweetContent.setText(content); } else { item.layoutRetweet.setVisibility(View.VISIBLE); String content = ""; if (model.status.userInfo != null) ; content = "评论 @" + model.status.userInfo.nickName + " 的微博: "; content += model.status.content; item.textRetweetContent.setText(content); } item.textTime.setText(DateUtils.getMagicTime(model.time)); if (!StringUtils.isNullOrEmpty(model.source)) item.textSource.setText(Html.fromHtml(model.source).toString()); return view; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return mList.get(position); } @Override public int getCount() { return mList.size(); } private View.OnClickListener retweetClickListener = new View.OnClickListener() { @Override public void onClick(View v) { CommentModel model = (CommentModel) v.getTag(); if (model.status != null) { LaunchHelper.startDetailActivity(v.getContext(), model.status); } } }; }; class ItemView { public AvatarView imageAvatar; public ImageView imageVerified; public TextView textName; public TextView textContent; public TextView textSource; public View layoutRetweet; public TextView textRetweetContent; public TextView textTime; } }