/* * Copyright 2015 TedXiong <xiong-wei@hotmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.android.ted.gank.main; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.Toast; import com.android.ted.gank.R; import com.android.ted.gank.adapter.BenefitGoodsItemAdapter; import com.android.ted.gank.db.Image; import com.android.ted.gank.model.Goods; import com.android.ted.gank.model.GoodsResult; import com.android.ted.gank.network.GankCloudApi; import com.android.ted.gank.service.ImageImproveService; import com.malinskiy.materialicons.IconDrawable; import com.malinskiy.materialicons.Iconify; import java.util.ArrayList; import java.util.List; import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; import io.realm.Realm; import io.realm.RealmChangeListener; import io.realm.RealmResults; import retrofit.RetrofitError; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class BenefitListFragment extends BaseLoadingFragment implements SwipeRefreshLayout.OnRefreshListener, RealmChangeListener { @Bind(R.id.benefit_recycler_view) RecyclerView mRecyclerView; @Bind(R.id.benefit_swipe_refresh) SwipeRefreshLayout mSwipeRefreshLayout; private ArrayList<Image> mAllBenefitImage; private BenefitGoodsItemAdapter mBenefitItemAdapter; private UpdateResultReceiver updateResultReceiver = new UpdateResultReceiver(); private Realm mRealm; private StaggeredGridLayoutManager mStaggeredGridLayoutManager; //是否正在更新图片信息 private boolean bImproveDoing = false; private boolean isALlLoad = false; private int hasLoadPage = 0; private boolean isLoadMore = false; private Observer<GoodsResult> getBenefitGoodsObserver = new Observer<GoodsResult>() { @Override public void onNext(final GoodsResult goodsResult) { if(mAllBenefitImage.isEmpty() && goodsResult.getResults().isEmpty()){ showNoDataView(); return; } showContent(); if(goodsResult.getResults().size() == GankCloudApi.LOAD_LIMIT){ hasLoadPage++; }else { isALlLoad = true; } if (analysisNewImage(goodsResult)) doImproveJob(); else refreshBenefitGoods(); } @Override public void onCompleted() { isLoadMore = false; mSwipeRefreshLayout.setRefreshing(false); } @Override public void onError(final Throwable error) { if (error instanceof RetrofitError) { Drawable errorDrawable = new IconDrawable(getContext(), Iconify.IconValue.zmdi_network_off) .colorRes(android.R.color.white); RetrofitError e = (RetrofitError) error; if (e.getKind() == RetrofitError.Kind.NETWORK) { showError(errorDrawable,"网络异常","好像您的网络出了点问题","重试",mErrorRetryListener); } else if (e.getKind() == RetrofitError.Kind.HTTP) { showError(errorDrawable,"服务异常","好像服务器出了点问题","再试一次",mErrorRetryListener); } else { showError(errorDrawable,"莫名异常","外星人进攻地球了?","反击",mErrorRetryListener); } } } }; private View.OnClickListener mErrorRetryListener = new View.OnClickListener() { @Override public void onClick(View v) { reloadData(); } }; @Override public void onRefresh() { reloadData(); } @Override public void onChange() { if(!bImproveDoing)return; if(!this.isVisible())return; refreshBenefitGoods(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAllBenefitImage = new ArrayList<>(); mBenefitItemAdapter = new BenefitGoodsItemAdapter(getActivity()) { @Override protected void onItemClick(View v, int position) { startViewerActivity(v,position); } }; mRealm = Realm.getInstance(getActivity()); mRealm.addChangeListener(this); } @Override View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_benifit_list,null); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); setupBaseView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); refreshBenefitGoods(); reloadData(); } @Override public void onResume() { super.onResume(); getActivity().registerReceiver(updateResultReceiver, new IntentFilter(ImageImproveService.ACTION_UPDATE_RESULT), ImageImproveService.PERMISSION_ACCESS_UPDATE_RESULT, null); } @Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(updateResultReceiver); } @Override public void onDestroy() { super.onDestroy(); mRealm.removeChangeListener(this); mRealm.close(); } private void refreshBenefitGoods(){ mAllBenefitImage.clear(); RealmResults<Image> results = mRealm.where(Image.class).notEqualTo("width",0).findAll(); mAllBenefitImage.addAll(results); mBenefitItemAdapter.replaceWith(mAllBenefitImage); } private void setupBaseView() { mSwipeRefreshLayout.setColorSchemeColors(R.color.colorPrimary, R.color.colorPrimaryDark); mSwipeRefreshLayout.setOnRefreshListener(this); mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager); mRecyclerView.setAdapter(mBenefitItemAdapter); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { BenefitListFragment.this.onScrollStateChanged(); } } }); } private void onScrollStateChanged(){ int[] positions = new int[mStaggeredGridLayoutManager.getSpanCount()]; mStaggeredGridLayoutManager.findLastVisibleItemPositions(positions); for (int position : positions) { if (position == mStaggeredGridLayoutManager.getItemCount() - 1) { loadMore(); break; } } } private void loadMore(){ if(isALlLoad){ Toast.makeText(getActivity(), "全部加载完毕", Toast.LENGTH_SHORT).show(); return; } if(isLoadMore)return; isLoadMore = true; loadData(hasLoadPage + 1); } private void reloadData(){ mSwipeRefreshLayout.setRefreshing(true); mAllBenefitImage.clear(); isALlLoad = false; hasLoadPage = 0; loadData(1); } private void loadData(int startPage){ GankCloudApi.getIns() .getBenefitsGoods(GankCloudApi.LOAD_LIMIT, startPage) .cache() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getBenefitGoodsObserver); } /*** * 分析新的数据 * * @param goodsResult * @return 是否有新数据插入 */ private boolean analysisNewImage(final GoodsResult goodsResult) { mRealm.beginTransaction(); if (null != goodsResult && null != goodsResult.getResults()) { for (Goods goods : goodsResult.getResults()) { Image image = Image.queryImageById(mRealm, goods.get_id()); if(null == image)image = mRealm.createObject(Image.class); Image.updateDbGoods(image,goods); } mRealm.commitTransaction(); return true; } mRealm.cancelTransaction(); return false; } private void doImproveJob() { bImproveDoing = true; Intent intent = new Intent(getActivity(), ImageImproveService.class); intent.setAction(ImageImproveService.ACTION_IMPROVE_IMAGE); getActivity().startService(intent); } private void showNoDataView(){ Drawable emptyDrawable = new IconDrawable(getContext(), Iconify.IconValue.zmdi_shopping_cart) .colorRes(android.R.color.white); List<Integer> skipIds = new ArrayList<>(); showEmpty(emptyDrawable, "数据列表为空", "没有拿到数据哎,请等一下再来玩妹子吧", skipIds); } private void startViewerActivity(View itemView, int position) { Intent intent = new Intent(getActivity(), ViewerActivity.class); intent.putExtra("index", position); // ActivityOptionsCompat options = ActivityOptionsCompat // .makeSceneTransitionAnimation(getActivity(), itemView, mBenefitItemAdapter.get(position).getUrl()); getActivity().startActivity(intent); } private class UpdateResultReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { bImproveDoing = false; int count = intent.getIntExtra(ImageImproveService.EXTRA_CHANGE, 0); if(count > 0) refreshBenefitGoods(); } } // public Map<String, View> getActivitySharedElements(int position,Map<String,View> map){ // map.put(mBenefitItemAdapter.get(position).getUrl(),mStaggeredGridLayoutManager.findViewByPosition(position)); // return map; // } // // public void onActivityReenter(Bundle bundle){ // mRecyclerView.scrollToPosition(bundle.getInt("index", 0)); // mRecyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { // @Override // public boolean onPreDraw() { // mRecyclerView.getViewTreeObserver().removeOnPreDrawListener(this); // mRecyclerView.requestLayout(); // getActivity().supportStartPostponedEnterTransition(); // return true; // } // }); // } }