package me.xiaopan.sketchsample.fragment; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.Toast; import org.apache.http.HttpResponse; import java.util.ArrayList; import java.util.List; import me.xiaopan.androidinjector.InjectContentView; import me.xiaopan.androidinjector.InjectExtra; import me.xiaopan.androidinjector.InjectView; import me.xiaopan.assemblyadapter.AssemblyRecyclerAdapter; import me.xiaopan.assemblyadapter.OnRecyclerLoadMoreListener; import me.xiaopan.gohttp.GoHttp; import me.xiaopan.gohttp.HttpRequest; import me.xiaopan.gohttp.HttpRequestFuture; import me.xiaopan.gohttp.JsonHttpResponseHandler; import me.xiaopan.gohttp.StringHttpResponseHandler; import me.xiaopan.prl.PullRefreshLayout; import me.xiaopan.sketch.util.SketchUtils; import me.xiaopan.sketchsample.MyFragment; import me.xiaopan.sketchsample.R; import me.xiaopan.sketchsample.activity.ApplyBackgroundCallback; import me.xiaopan.sketchsample.activity.DetailActivity; import me.xiaopan.sketchsample.adapter.itemfactory.LoadMoreItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.StaggeredImageItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.StarHeaderItemFactory; import me.xiaopan.sketchsample.net.request.StarHomeBackgroundRequest; import me.xiaopan.sketchsample.net.request.StarImageRequest; import me.xiaopan.sketchsample.util.ScrollingPauseLoadManager; import me.xiaopan.sketchsample.widget.HintView; /** * 明星个人页面 */ @InjectContentView(R.layout.fragment_star_home) public class StarHomeFragment extends MyFragment implements StaggeredImageItemFactory.OnItemClickListener, PullRefreshLayout.OnRefreshListener, OnRecyclerLoadMoreListener { public static final String PARAM_REQUIRED_STRING_STAR_TITLE = "PARAM_REQUIRED_STRING_STAR_TITLE"; public static final String PARAM_REQUIRED_STRING_STAR_URL = "PARAM_REQUIRED_STRING_STAR_URL"; @InjectView(R.id.refreshLayout_starHome) private PullRefreshLayout pullRefreshLayout; @InjectView(R.id.recycler_starHome) private RecyclerView recyclerView; @InjectView(R.id.hintView_starHome) private HintView hintView; @InjectExtra(PARAM_REQUIRED_STRING_STAR_TITLE) private String starTitle; @InjectExtra(PARAM_REQUIRED_STRING_STAR_URL) private String starHomeUrl; private StarImageRequest starImageRequest; private HttpRequestFuture refreshRequest; private AssemblyRecyclerAdapter adapter; private HttpRequestFuture loadMoreRequest; private ApplyBackgroundCallback applyBackgroundCallback; private String backgroundImageUri; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof ApplyBackgroundCallback) { applyBackgroundCallback = (ApplyBackgroundCallback) activity; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); starImageRequest = new StarImageRequest(Uri.parse(starHomeUrl).getLastPathSegment()); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); pullRefreshLayout.setOnRefreshListener(this); recyclerView.setOnScrollListener(new ScrollingPauseLoadManager(getActivity())); recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); int padding = SketchUtils.dp2px(getActivity(), 2); recyclerView.setPadding(padding, padding, padding, padding); recyclerView.setClipToPadding(false); if (adapter == null) { pullRefreshLayout.startRefresh(); } else { setAdapter(adapter); } } @Override public void onDetach() { if (refreshRequest != null && !refreshRequest.isFinished()) { refreshRequest.cancel(true); } super.onDetach(); } @Override protected void onUserVisibleChanged(boolean isVisibleToUser) { if (applyBackgroundCallback != null && isVisibleToUser) { changeBackground(backgroundImageUri); } } private void changeBackground(String imageUri) { this.backgroundImageUri = imageUri; if (applyBackgroundCallback != null) { applyBackgroundCallback.onApplyBackground(backgroundImageUri); } } @Override public void onItemClick(int position, StarImageRequest.Image image, String loadingImageOptionsInfo) { List<StarImageRequest.Image> imageList = adapter.getDataList(); ArrayList urlList = new ArrayList<String>(); for (StarImageRequest.Image imageItem : imageList) { urlList.add(imageItem.getSourceUrl()); } DetailActivity.launch(getActivity(), urlList, loadingImageOptionsInfo, position - adapter.getHeaderItemCount()); } private void setAdapter(AssemblyRecyclerAdapter adapter) { recyclerView.setAdapter(adapter); recyclerView.scheduleLayoutAnimation(); this.adapter = adapter; } @Override public void onRefresh() { if (refreshRequest != null && !refreshRequest.isFinished()) { return; } if (loadMoreRequest != null && !loadMoreRequest.isFinished()) { loadMoreRequest.cancel(true); } if (adapter != null) { adapter.setLoadMoreEnd(false); } refreshRequest = GoHttp.with(getActivity()).newRequest(starHomeUrl, new StringHttpResponseHandler(), new HttpRequest.Listener<StarHomeBackgroundRequest.Background>() { @Override public void onStarted(HttpRequest httpRequest) { hintView.hidden(); } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, StarHomeBackgroundRequest.Background backgroundObject, boolean b, boolean b2) { if (getActivity() == null) { return; } loadItems(backgroundObject.getBackgroundImageUrl()); } @Override public void onFailed(HttpRequest httpRequest, HttpResponse httpResponse, HttpRequest.Failure failure, boolean b, boolean b2) { if (getActivity() == null) { return; } new Handler().postDelayed(new Runnable() { @Override public void run() { pullRefreshLayout.stopRefresh(); } }, 500); if (adapter == null) { hintView.failed(failure, new View.OnClickListener() { @Override public void onClick(View v) { pullRefreshLayout.startRefresh(); } }); } else { Toast.makeText(getActivity(), "刷新失败", Toast.LENGTH_SHORT).show(); } } @Override public void onCanceled(HttpRequest httpRequest) { } }).responseHandleCompletedAfterListener(new StarHomeBackgroundRequest.ResponseHandler()).go(); } private void loadItems(final String backgroundImageUrl) { starImageRequest.setStart(0); refreshRequest = GoHttp.with(getActivity()).newRequest(starImageRequest, new JsonHttpResponseHandler(StarImageRequest.Response.class), new HttpRequest.Listener<StarImageRequest.Response>() { @Override public void onStarted(HttpRequest httpRequest) { hintView.hidden(); } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, StarImageRequest.Response responseObject, boolean b, boolean b2) { if (getActivity() == null) { return; } AssemblyRecyclerAdapter adapter = new AssemblyRecyclerAdapter(responseObject.getImages()); if (backgroundImageUrl != null) { adapter.addHeaderItem(new StarHeaderItemFactory().fullSpan(recyclerView), backgroundImageUrl); } adapter.addItemFactory(new StaggeredImageItemFactory(StarHomeFragment.this)); adapter.setLoadMoreItem(new LoadMoreItemFactory(StarHomeFragment.this).fullSpan(recyclerView)); setAdapter(adapter); new Handler().postDelayed(new Runnable() { @Override public void run() { pullRefreshLayout.stopRefresh(); } }, 500); if (responseObject.getImages() != null && responseObject.getImages().size() > 0) { changeBackground(responseObject.getImages().get(0).getSourceUrl()); } } @Override public void onFailed(HttpRequest httpRequest, HttpResponse httpResponse, HttpRequest.Failure failure, boolean b, boolean b2) { if (getActivity() == null) { return; } new Handler().postDelayed(new Runnable() { @Override public void run() { pullRefreshLayout.stopRefresh(); } }, 500); if (adapter == null) { hintView.failed(failure, new View.OnClickListener() { @Override public void onClick(View v) { pullRefreshLayout.startRefresh(); } }); } else { Toast.makeText(getActivity(), "刷新失败", Toast.LENGTH_SHORT).show(); } } @Override public void onCanceled(HttpRequest httpRequest) { } }).responseHandleCompletedAfterListener(new StarImageRequest.ResponseHandler(getActivity().getBaseContext())).go(); } @Override public void onLoadMore(AssemblyRecyclerAdapter assemblyRecyclerAdapter) { starImageRequest.setStart(adapter.getDataCount()); loadMoreRequest = GoHttp.with(getActivity()).newRequest(starImageRequest, new JsonHttpResponseHandler(StarImageRequest.Response.class), new HttpRequest.Listener<StarImageRequest.Response>() { @Override public void onStarted(HttpRequest httpRequest) { } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, StarImageRequest.Response responseObject, boolean b, boolean b2) { if (getActivity() == null) { return; } List<StarImageRequest.Image> newImageList = responseObject.getImages(); if (newImageList != null && newImageList.size() > 0) { adapter.addAll(newImageList); if (newImageList.size() < starImageRequest.getSize()) { adapter.setLoadMoreEnd(true); Toast.makeText(getActivity(), "新送达" + newImageList.size() + "个包裹,已全部送完!", Toast.LENGTH_SHORT).show(); } else { adapter.setLoadMoreEnd(false); Toast.makeText(getActivity(), "新送达" + newImageList.size() + "个包裹", Toast.LENGTH_SHORT).show(); } } else { adapter.setLoadMoreEnd(true); Toast.makeText(getActivity(), "没有您的包裹了", Toast.LENGTH_SHORT).show(); } adapter.notifyDataSetChanged(); } @Override public void onFailed(HttpRequest httpRequest, HttpResponse httpResponse, HttpRequest.Failure failure, boolean b, boolean b2) { if (getActivity() == null) { return; } adapter.loadMoreFailed(); Toast.makeText(getActivity(), "快递投递失败", Toast.LENGTH_SHORT).show(); } @Override public void onCanceled(HttpRequest httpRequest) { adapter.loadMoreFailed(); } }).responseHandleCompletedAfterListener(new StarImageRequest.ResponseHandler(getActivity().getBaseContext())).go(); } }