/** * @description: 风景查看界面 * @author chenshiqiang E-mail:csqwyyx@163.com * @date 2014年5月10日 下午11:58:15 * @version 1.0 */ package com.csq.thesceneryalong.ui.activitys; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.*; import android.widget.TextView; import com.csq.thesceneryalong.R; import com.csq.thesceneryalong.db.Scenery; import com.csq.thesceneryalong.io.db.SceneryDb; import com.csq.thesceneryalong.models.events.EventSceneryUpdated; import com.csq.thesceneryalong.models.models.SceneryType; import com.csq.thesceneryalong.ui.activitys.base.BaseActionBarActivity; import com.csq.thesceneryalong.ui.views.SceneryDetailDrawerView; import com.csq.thesceneryalong.ui.views.scenery.ScenenryImageItemView; import com.csq.thesceneryalong.ui.views.scenery.ScenenryItemView; import com.csq.thesceneryalong.ui.views.scenery.ScenenryVideoItemView; import com.csq.thesceneryalong.ui.widgets.MultiDirectionSlidingDrawer; import com.csq.thesceneryalong.ui.widgets.MultiDirectionSlidingDrawer.OnDrawerCloseListener; import com.csq.thesceneryalong.ui.widgets.MultiDirectionSlidingDrawer.OnDrawerOpenListener; import com.csq.thesceneryalong.utils.DebugLog; import com.csq.thesceneryalong.utils.tasks.CsqBackgroundTask; import de.greenrobot.event.EventBus; import eu.inmite.android.lib.dialogs.ISimpleDialogListener; import eu.inmite.android.lib.dialogs.SimpleDialogFragment; import java.lang.ref.SoftReference; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class ScenerysActivity extends BaseActionBarActivity implements ISimpleDialogListener{ // ------------------------ Constants ------------------------ public static final String EXTRA_TRACK_ID = "extra_track_id"; public static final String EXTRA_TRACK_NAME = "extra_track_name"; public static final String EXTRA_SCENERY_INDEX = "extra_scenery_index"; public static final int SimpleDialogDeleteSceneryRequestCode = 1; // ------------------------- Fields -------------------------- protected long extra_track_id; protected String extra_track_name; protected int extra_scenery_index; protected ViewPager vpMedie; protected TextView tvIndex; protected MultiDirectionSlidingDrawer lyDrawer; protected SceneryDetailDrawerView vDetailDrawer; private List<Scenery> scenerys; private SceneryPagerAdapter adapter; private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int position) { // TODO Auto-generated method stub DebugLog.d("OnPageChangeListener onPageSelected = " + position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub DebugLog.d("OnPageChangeListener onPageScrolled = " + position + " : " + positionOffset + " : " + positionOffsetPixels); } @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub if(state == ViewPager.SCROLL_STATE_DRAGGING){ DebugLog.d("OnPageChangeListener SCROLL_STATE_DRAGGING"); }else if(state == ViewPager.SCROLL_STATE_SETTLING){ DebugLog.d("OnPageChangeListener SCROLL_STATE_SETTLING"); }else if(state == ViewPager.SCROLL_STATE_IDLE){ DebugLog.d("OnPageChangeListener SCROLL_STATE_IDLE"); pageChanged(); } } }; // ----------------------- Constructors ---------------------- public static void launch(Context context, long trackId, String trackName, int sceneryIndex){ Intent i = new Intent(context, ScenerysActivity.class); i.putExtra(EXTRA_TRACK_ID, trackId); i.putExtra(EXTRA_TRACK_NAME, trackName); i.putExtra(EXTRA_SCENERY_INDEX, sceneryIndex); context.startActivity(i); } // -------- Methods for/from SuperClass/Interfaces ----------- @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.view_scenerys); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(false); vpMedie = getViewById(R.id.vpMedie); tvIndex = getViewById(R.id.tvIndex); lyDrawer = getViewById(R.id.lyDrawer); vDetailDrawer = getViewById(R.id.vDetailDrawer); Intent i = getIntent(); extra_track_id = i.getLongExtra(EXTRA_TRACK_ID, 0); extra_track_name = i.getStringExtra(EXTRA_TRACK_NAME); extra_scenery_index = i.getIntExtra(EXTRA_SCENERY_INDEX, 0); setupView(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().unregister(this); } } protected void setupView(){ if(!EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().register(this); } getSupportActionBar().setTitle(extra_track_name); /*vpMedie.setTransitionEffect(JazzyViewPager.TransitionEffect.Tablet);*/ adapter = new SceneryPagerAdapter(); vpMedie.setAdapter(adapter); /*vpMedie.setPageMargin(30);*/ vpMedie.setOffscreenPageLimit(3); vpMedie.setOnPageChangeListener(mOnPageChangeListener); refreshScenenrys(); lyDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener() { @Override public void onDrawerOpened() { // TODO Auto-generated method stub lyDrawer.getHandle().setBackgroundResource(R.drawable.ic_map_drawer_down); } }); lyDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener() { @Override public void onDrawerClosed() { // TODO Auto-generated method stub lyDrawer.getHandle().setBackgroundResource(R.drawable.ic_map_drawer_up); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_activity_scenerys, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case android.R.id.home: finish(); break; case R.id.options_item_edit: if(scenerys != null && lastPageIndex < scenerys.size()){ Scenery senery = scenerys.get(lastPageIndex); EditSceneryActivity.launch(activity, senery.getId()); } break; case R.id.options_item_delete: SimpleDialogFragment.createBuilder(activity, getSupportFragmentManager()) .setTitle(R.string.deleteScenery) .setMessage(R.string.deleteSceneryWarn) .setPositiveButtonText(R.string.yes) .setNegativeButtonText(R.string.no) .setRequestCode(SimpleDialogDeleteSceneryRequestCode) .show(); break; } return super.onOptionsItemSelected(item); } @Override public void onPositiveButtonClicked(int requestCode) { // TODO Auto-generated method stub if(requestCode == SimpleDialogDeleteSceneryRequestCode){ if(scenerys != null && lastPageIndex < scenerys.size()){ Scenery remove = null; synchronized (scenerys) { remove = scenerys.remove(lastPageIndex); adapter.notifyDataSetChanged(); } SceneryDb.getInstance().delete(remove); if(scenerys.isEmpty()){ finish(); }else{ //序号减1 lastPageIndex--; if(lastPageIndex < 0){ lastPageIndex = 0; } vpMedie.setCurrentItem(lastPageIndex); pageChanged(); } } } } @Override public void onNegativeButtonClicked(int requestCode) { // TODO Auto-generated method stub } @Override public void onBackPressed() { // TODO Auto-generated method stub if(lyDrawer.isOpened()){ lyDrawer.close(); return; } super.onBackPressed(); } /** * @description: 刷新风景数据 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public void refreshScenenrys(){ //异步加载风景 new CsqBackgroundTask<List<Scenery>>(this) { @Override protected List<Scenery> onRun() { // TODO Auto-generated method stub return SceneryDb.getInstance().queryScenerys(extra_track_id); } @Override protected void onResult(List<Scenery> result) { // TODO Auto-generated method stub scenerysLoaded(result); } }.start(); } /** * @description: 风景列表加载回调 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param ss */ public void scenerysLoaded(List<Scenery> ss){ synchronized (this) { this.scenerys = ss; adapter.notifyDataSetChanged(); } int curPageIndex = extra_scenery_index; if(curPageIndex < 0){ curPageIndex = 0; } if(curPageIndex > scenerys.size()){ curPageIndex = scenerys.size() - 1; } vDetailDrawer.updateTrack(extra_track_id); final int to = curPageIndex; vpMedie.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub vpMedie.setCurrentItem(to); pageChanged(); } }); } @Override protected void releaseResources() { // TODO Auto-generated method stub } @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); } // --------------------- Methods public ---------------------- // --------------------- Methods private --------------------- private int lastPageIndex = 0; protected void pageChanged(){ if(scenerys == null){ return; } //先暂停上一个展示的页面 View last = vpMedie.findViewWithTag("" + lastPageIndex); if(last != null){ ((ScenenryItemView)last).onHide(); } int newPage = vpMedie.getCurrentItem(); //再播放这一个展示的页面 View thisView = vpMedie.findViewWithTag("" + newPage); if(thisView != null){ ((ScenenryItemView)thisView).onShow(); } tvIndex.setText((newPage+1) + " / " + scenerys.size()); vDetailDrawer.updateScenerys(scenerys, newPage); lastPageIndex = newPage; } public void onEventMainThread(EventSceneryUpdated event){ scenerys.set(lastPageIndex, event.scenery); vDetailDrawer.updateScenery(event.scenery); } // --------------------- Getter & Setter --------------------- // --------------- Inner and Anonymous Classes --------------- private List<SoftReference<ScenenryImageItemView>> imageCache = new LinkedList<SoftReference<ScenenryImageItemView>>(); private List<SoftReference<ScenenryVideoItemView>> videoCache = new LinkedList<SoftReference<ScenenryVideoItemView>>(); private class SceneryPagerAdapter extends PagerAdapter{ public SceneryPagerAdapter(){ } @Override public int getCount() { // TODO Auto-generated method stub if(scenerys != null){ return scenerys.size(); } return 0; } public Scenery getItem(int position){ return scenerys.get(position); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public boolean isViewFromObject(View view, Object obj) { // TODO Auto-generated method stub return view == obj; } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub ScenenryItemView view = null; Scenery data = getItem(position); if(data.getType().equals(SceneryType.image.name())){ //先从缓存中找 if(!imageCache.isEmpty()){ Iterator<SoftReference<ScenenryImageItemView>> it = imageCache.iterator(); while(it.hasNext()){ view = it.next().get(); it.remove(); if(view != null){ break; } } } //缓存没有,再加载 if(view == null){ view = new ScenenryImageItemView(activity, vpMedie); } }else{ //先从缓存中找 if(!videoCache.isEmpty()){ Iterator<SoftReference<ScenenryVideoItemView>> it = videoCache.iterator(); while(it.hasNext()){ view = it.next().get(); it.remove(); if(view != null){ break; } } } //缓存没有,再加载 if(view == null){ view = new ScenenryVideoItemView(activity); } } ((View)view).setTag("" + position); view.setData(getItem(position)); container.addView((View)view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); //vpMedie.setObjectForPosition(view, position); return (View)view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub View view = container.findViewWithTag("" + position); //View view = vpMedie.findViewFromObject(position); if(view != null){ container.removeView(view); if(view instanceof ScenenryImageItemView){ ScenenryImageItemView v = (ScenenryImageItemView)view; v.releaseResources(); imageCache.add(new SoftReference<ScenenryImageItemView>(v)); }else if(view instanceof ScenenryVideoItemView){ ScenenryVideoItemView v = (ScenenryVideoItemView)view; v.releaseResources(); videoCache.add(new SoftReference<ScenenryVideoItemView>(v)); } } } } }