package me.xiaopan.sketchsample.fragment; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import org.apache.http.HttpResponse; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.ArrayList; import java.util.List; import me.xiaopan.androidinjector.InjectContentView; import me.xiaopan.androidinjector.InjectView; import me.xiaopan.assemblyadapter.AssemblyRecyclerAdapter; import me.xiaopan.gohttp.GoHttp; import me.xiaopan.gohttp.HttpRequest; import me.xiaopan.gohttp.HttpRequestFuture; import me.xiaopan.gohttp.StringHttpResponseHandler; import me.xiaopan.prl.PullRefreshLayout; import me.xiaopan.sketchsample.MyFragment; import me.xiaopan.sketchsample.R; import me.xiaopan.sketchsample.activity.StarHomeActivity; import me.xiaopan.sketchsample.adapter.itemfactory.ItemTitleItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.StarCatalogItemFactory; import me.xiaopan.sketchsample.bean.Star; import me.xiaopan.sketchsample.net.request.ManStarCatalogRequest; import me.xiaopan.sketchsample.net.request.StarCatalogRequest; import me.xiaopan.sketchsample.net.request.WomanStarCatalogRequest; import me.xiaopan.sketchsample.util.ScrollingPauseLoadManager; import me.xiaopan.sketchsample.util.Settings; import me.xiaopan.sketchsample.widget.HintView; /** * 明星目录页面 */ @InjectContentView(R.layout.fragment_star_catalog) public class StarCatalogFragment extends MyFragment implements PullRefreshLayout.OnRefreshListener, StarCatalogItemFactory.OnClickStarListener { @InjectView(R.id.refreshLayout_starCatalog) private PullRefreshLayout refreshLayout; @InjectView(R.id.hint_starCatalog) private HintView hintView; @InjectView(R.id.recyclerView_starCatalog_content) private RecyclerView recyclerView; private HttpRequestFuture httpRequestFuture; private AssemblyRecyclerAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { EventBus.getDefault().register(this); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return adapter != null ? adapter.getSpanSize(position) : 1; } }); recyclerView.setLayoutManager(gridLayoutManager); recyclerView.setOnScrollListener(new ScrollingPauseLoadManager(view.getContext())); int padding = (int) getResources().getDimension(R.dimen.home_category_margin_border); recyclerView.setPadding(padding, padding, padding, padding); recyclerView.setClipToPadding(false); refreshLayout.setOnRefreshListener(this); if (adapter == null) { refreshLayout.startRefresh(); } else { recyclerView.setAdapter(adapter); recyclerView.scheduleLayoutAnimation(); } } @Override public void onDestroyView() { EventBus.getDefault().unregister(this); super.onDestroyView(); } @Override public void onRefresh() { if (httpRequestFuture != null && !httpRequestFuture.isFinished()) { return; } load(false, false); } @Override public void onDetach() { if (httpRequestFuture != null && !httpRequestFuture.isFinished()) { httpRequestFuture.cancel(true); } super.onDetach(); } private void load(boolean isMan, final boolean last) { httpRequestFuture = GoHttp.with(getActivity()).newRequest(isMan ? new ManStarCatalogRequest() : new WomanStarCatalogRequest(), new StringHttpResponseHandler(), new HttpRequest.Listener<StarCatalogRequest.Result>() { @Override public void onStarted(HttpRequest httpRequest) { hintView.hidden(); } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, StarCatalogRequest.Result result, boolean b, boolean b2) { if (last) { append(adapter, result); recyclerView.setAdapter(adapter); recyclerView.scheduleLayoutAnimation(); new Handler().postDelayed(new Runnable() { @Override public void run() { refreshLayout.stopRefresh(); } }, 1000); } else { adapter = new AssemblyRecyclerAdapter(new ArrayList()); append(adapter, result); adapter.addItemFactory(new StarCatalogItemFactory(StarCatalogFragment.this)); adapter.addItemFactory(new ItemTitleItemFactory().fullSpan(recyclerView)); load(true, true); } } @Override public void onFailed(HttpRequest httpRequest, HttpResponse httpResponse, HttpRequest.Failure failure, boolean b, boolean b2) { new Handler().postDelayed(new Runnable() { @Override public void run() { refreshLayout.stopRefresh(); } }, 1000); if (adapter == null) { hintView.failed(failure, new View.OnClickListener() { @Override public void onClick(View v) { refreshLayout.startRefresh(); } }); } else { Toast.makeText(getActivity(), "刷新失败", Toast.LENGTH_SHORT).show(); } } @Override public void onCanceled(HttpRequest httpRequest) { } public void append(AssemblyRecyclerAdapter adapter, StarCatalogRequest.Result result) { List<Star> starList = result.getStarList(); if (starList == null) { return; } adapter.getDataList().add(result.getTitle()); adapter.getDataList().addAll(starList); } }).responseHandleCompletedAfterListener(new StarCatalogRequest.ResponseHandler(isMan)).go(); } @Override public void onClickImage(Star star) { StarHomeActivity.launch(getActivity(), star.name); } @SuppressWarnings("unused") @Subscribe public void onGlobalAttrChanged(String key) { if (Settings.PREFERENCE_PLAY_GIF_ON_LIST.equals(key) || Settings.PREFERENCE_GLOBAL_IN_PREFER_QUALITY_OVER_SPEED.equals(key) || Settings.PREFERENCE_GLOBAL_LOW_QUALITY_IMAGE.equals(key) || Settings.PREFERENCE_THUMBNAIL_MODE.equals(key) || Settings.PREFERENCE_CACHE_PROCESSED_IMAGE.equals(key) || Settings.PREFERENCE_SCROLLING_PAUSE_LOAD.equals(key) || Settings.PREFERENCE_CORRECT_IMAGE_ORIENTATION.equals(key) || Settings.PREFERENCE_MOBILE_NETWORK_PAUSE_DOWNLOAD.equals(key)) { if (adapter != null) { adapter.notifyDataSetChanged(); } } } }