package com.ustc.dystu.dandelion; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.TextUtils; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.ustc.dystu.dandelion.bean.FootInfo; import com.ustc.dystu.dandelion.bean.NearInfo; import com.ustc.dystu.dandelion.constant.Constants; import com.ustc.dystu.dandelion.fragment.BaseFragment; import com.ustc.dystu.dandelion.net.DandelionAPI; import com.ustc.dystu.dandelion.utils.LocationTask; import com.ustc.dystu.dandelion.utils.Logger; import com.ustc.dystu.dandelion.utils.image.ImageCache; import com.ustc.dystu.dandelion.utils.image.ImageFetcher; import com.ustc.dystu.dandelion.utils.image.Utils; public class NoteDetailActivity extends Activity { private static final int REQUEST_GET_NOTE_INFO = 0x1; private static final String TAG = "NoteDetailActivity"; ViewPager mViewPager; private NotePagerAdapter mPagerAdapter; ArrayList<FootInfo> mFootList; private Button btnBack; private ImageView btnShare; private LinearLayout btnComment; private TextView tvTime; private TextView tvLocation; private TextView tvTitle; private TextView tvText; private TextView tvCommentNum; private TextView tvBottomLocation; private ProgressDialog pdProgress; private int mTotalNum; private int mIndex; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case REQUEST_GET_NOTE_INFO: if (pdProgress != null) { pdProgress.dismiss(); } prepareFootList(); if (mNearInfo != null) { mIndex = mFootList.indexOf(mNearInfo.footInfo); Logger.d(TAG, "current index-->" + mIndex); mTotalNum = mFootList.size(); mViewPager.setAdapter(mPagerAdapter); mViewPager.setCurrentItem(mIndex); updateControlBar(mIndex); } break; case BaseFragment.ERROR_RESPONSE: if (msg.obj != null) { Toast.makeText(NoteDetailActivity.this, (String) msg.obj, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(NoteDetailActivity.this, "网络异常", Toast.LENGTH_SHORT).show(); } break; default: break; } } }; @SuppressWarnings("unchecked") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_note_detail); mViewPager = (ViewPager) findViewById(R.id.tab_pager); mViewPager.setOffscreenPageLimit(1); Intent intent = getIntent(); int index = intent.getIntExtra("index", 0); mFootList = (ArrayList<FootInfo>) intent .getSerializableExtra("foot_list"); mPagerAdapter = new NotePagerAdapter(); initViews(); if (mFootList != null) { FootInfo info = mFootList.get(index); prepareFootList(); mViewPager.setAdapter(mPagerAdapter); mIndex = mFootList.indexOf(info); mViewPager.setCurrentItem(mIndex); mTotalNum = mFootList.size(); Logger.d(TAG, "foot list size-->" + mFootList.size() + "; mIndex-->" + mIndex); updateControlBar(mIndex); } else { mFootList = new ArrayList<FootInfo>(); mNearInfo = (NearInfo) intent.getSerializableExtra("near_info"); final String[] weiboIds = mNearInfo.noteInfo.weiboIds; if (mNearInfo.noteInfo.weiboIds != null) { pdProgress = new ProgressDialog(this); pdProgress.setMessage("正在加载, 请稍候..."); pdProgress.setCanceledOnTouchOutside(false); pdProgress.show(); new Thread() { public void run() { ArrayList<FootInfo> weiboList = DandelionAPI .getInstance(NoteDetailActivity.this) .getWeiboInfo(weiboIds); if (weiboList != null && !weiboList.isEmpty()) { Collections.sort(weiboList, comparator); mFootList.clear(); mFootList.addAll(weiboList); mHandler.sendEmptyMessage(REQUEST_GET_NOTE_INFO); } else { mHandler.sendEmptyMessage(BaseFragment.ERROR_RESPONSE); } }; }.start(); } } } boolean isControlShow = true; LocationTask locationUtils; private RelativeLayout rlControl;; private void initViews() { locationUtils = new LocationTask(NoteDetailActivity.this); btnBack = (Button) findViewById(R.id.btn_back); btnBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { NoteDetailActivity.this.finish(); } }); btnShare = (ImageView) findViewById(R.id.btn_share); btnShare.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { com.ustc.dystu.dandelion.utils.Utils.share(NoteDetailActivity.this); } }); btnComment = (LinearLayout) findViewById(R.id.btn_comment); btnComment.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int i = mViewPager.getCurrentItem(); FootInfo info = mFootList.get(i); Intent intent = new Intent(); intent.putExtra("foot_info", info); intent.setClass(NoteDetailActivity.this, CommentActivity.class); startActivity(intent); } }); tvTime = (TextView) findViewById(R.id.tv_time); tvLocation = (TextView) findViewById(R.id.tv_location); tvTitle = (TextView) findViewById(R.id.tv_title); tvText = (TextView) findViewById(R.id.tv_text); tvCommentNum = (TextView) findViewById(R.id.tv_comment_num); tvBottomLocation = (TextView) findViewById(R.id.tv_bottom_location); rlControl = (RelativeLayout) findViewById(R.id.ll_control_bar); final GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (!isControlShow) { rlControl.setVisibility(View.VISIBLE); tvBottomLocation.setVisibility(View.GONE); isControlShow = true; } else { rlControl.setVisibility(View.GONE); tvBottomLocation.setVisibility(View.VISIBLE); isControlShow = false; } return true; } }, null, true); mViewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return false; } }); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { updateControlBar(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } private void updateControlBar(int pos) { FootInfo info = mFootList.get(pos); tvTime.setText(info.getDetailFormatTime2()); tvTitle.setText((pos + 1) + "/" + mTotalNum); if (!TextUtils.isEmpty(info.formate_loaction)) { tvLocation.setText(info.getFormatLoaciton()); tvBottomLocation.setText(info.getFormatLoaciton()); } else { tvLocation.setText(""); tvBottomLocation.setText(""); locationUtils.loadLocation(info, tvLocation); locationUtils.loadLocation(info, tvBottomLocation); } if (!TextUtils.isEmpty(info.original_pic)) { tvText.setVisibility(View.VISIBLE); tvText.setText(info.text); } else { tvText.setVisibility(View.GONE); } tvCommentNum.setText("(" + info.comments_count + ")"); } private void prepareFootList() { int size = mFootList.size(); Logger.d(TAG, "mFootList size-->" + size); ArrayList<FootInfo> footList = new ArrayList<FootInfo>(); for (int i = 0; i < size; i++) { FootInfo info = mFootList.get(i); if (!footList.contains(info)) { footList.add(info); } if (info.picIds != null && info.picIds.length > 1) { for (int j = 0; j < info.picIds.length; j++) { String orgUrl = getThumnailUrl(info.picIds[j]); FootInfo copy = FootInfo.copy(info); copy.original_pic = orgUrl; copy.defaultPicId = info.picIds[j]; if (!footList.contains(copy)) { footList.add(copy); } } } } mFootList.clear(); mFootList.addAll(footList); } private String getThumnailUrl(String picId) { // http://ww3.sinaimg.cn/large/590473f6jw1dwmgp7b8tjj.jpg return "http://ww3.sinaimg.cn/large/" + picId + ".jpg"; } class NotePagerAdapter extends PagerAdapter { HashMap<Integer, View> views; private ImageFetcher mImageWorker; public NotePagerAdapter() { views = new HashMap<Integer, View>(); int[] wh = Utils.getBigPicWidthAndHeight(NoteDetailActivity.this); mImageWorker = new ImageFetcher(NoteDetailActivity.this, wh[0], wh[1]); mImageWorker.setImageCache(new ImageCache(NoteDetailActivity.this, Constants.THUMNAIL_CACHE_PATH + "/.bigthumnail")); mImageWorker.setLoadingImage(R.drawable.share_public_headview_bg); mImageWorker.setImageFadeIn(false); } @Override public int getCount() { return mFootList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == ((View) object); } public HashMap<Integer, View> getViews() { return views; } @Override public Object instantiateItem(ViewGroup container, int position) { View pageView = views.get(position); if (pageView == null) { FootInfo info = mFootList.get(position); pageView = getLayoutInflater().inflate( R.layout.pager_item_foot_detail, null); ImageView ivIcon = (ImageView) pageView .findViewById(R.id.iv_icon); TextView tvText = (TextView) pageView .findViewById(R.id.tv_text); Logger.d(TAG, "get view org url-->" + info.original_pic); if (!TextUtils.isEmpty(info.original_pic)) { ivIcon.setVisibility(View.VISIBLE); tvText.setVisibility(View.GONE); mImageWorker.loadImage(info.original_pic, ivIcon, true); } else { ivIcon.setImageResource(R.drawable.share_public_headview_bg); ivIcon.setVisibility(View.GONE); tvText.setVisibility(View.VISIBLE); tvText.setText(info.text); } views.put(position, pageView); } container.addView(pageView); return pageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = views.get(position); container.removeView(views.get(position)); views.remove(position); try { mImageWorker.cancelWork((ImageView) view .findViewById(R.id.iv_icon)); Bitmap bitmap = mImageWorker.getImageCache() .getBitmapFromMemCache( mFootList.get(position).original_pic); if (bitmap != null) { bitmap.recycle(); bitmap = null; } mImageWorker.getImageCache().getMemCache() .remove(mFootList.get(position).original_pic); } catch (Exception e) { e.printStackTrace(); } } } Comparator<FootInfo> comparator = new Comparator<FootInfo>() { @Override public int compare(FootInfo lhs, FootInfo rhs) { BigInteger lid = new BigInteger(lhs.id); BigInteger rid = new BigInteger(rhs.id); return lid.compareTo(rid); } }; private NearInfo mNearInfo; }