package me.xiaopan.sketchsample.fragment; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; 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.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.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.net.request.SearchImageRequest; import me.xiaopan.sketchsample.net.request.StarImageRequest; import me.xiaopan.sketchsample.util.ScrollingPauseLoadManager; import me.xiaopan.sketchsample.util.Settings; import me.xiaopan.sketchsample.widget.HintView; /** * 图片搜索Fragment */ @InjectContentView(R.layout.fragment_search) public class SearchFragment extends MyFragment implements StaggeredImageItemFactory.OnItemClickListener, PullRefreshLayout.OnRefreshListener, OnRecyclerLoadMoreListener { public static final String PARAM_OPTIONAL_STRING_SEARCH_KEYWORD = "PARAM_OPTIONAL_STRING_SEARCH_KEYWORD"; @InjectView(R.id.refreshLayout_search) PullRefreshLayout pullRefreshLayout; @InjectView(R.id.list_search) private RecyclerView recyclerView; @InjectView(R.id.hintView_search) private HintView hintView; @InjectExtra(PARAM_OPTIONAL_STRING_SEARCH_KEYWORD) private String searchKeyword = "GIF"; private SearchImageRequest searchImageRequest; private HttpRequestFuture refreshRequest; private HttpRequestFuture loadMoreRequest; private AssemblyRecyclerAdapter adapter; 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); searchImageRequest = new SearchImageRequest(searchKeyword); setHasOptionsMenu(true); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setTitle(searchKeyword); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { EventBus.getDefault().register(this); return super.onCreateView(inflater, container, savedInstanceState); } private void setTitle(String subtitle) { if (getActivity() != null && getActivity() instanceof AppCompatActivity) { ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); if (actionBar != null) { actionBar.setSubtitle(subtitle); } } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_search_view, menu); SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_searchView)); searchView.setQueryHint(searchKeyword); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { s = s.trim(); if ("".equals(s)) { Toast.makeText(getActivity(), "搜索关键字不能为空", Toast.LENGTH_LONG).show(); return false; } setTitle(s); Bundle bundle = new Bundle(); bundle.putString(SearchFragment.PARAM_OPTIONAL_STRING_SEARCH_KEYWORD, s); SearchFragment searchFragment = new SearchFragment(); searchFragment.setArguments(bundle); getFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.window_push_enter, R.anim.window_push_exit) .replace(R.id.frame_main_content, searchFragment) .commit(); ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(getActivity().getCurrentFocus() .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); return true; } @Override public boolean onQueryTextChange(String s) { return false; } }); super.onCreateOptionsMenu(menu, inflater); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); pullRefreshLayout.setOnRefreshListener(this); recyclerView.setOnScrollListener(new ScrollingPauseLoadManager(view.getContext())); 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 onDestroyView() { EventBus.getDefault().unregister(this); setTitle(""); super.onDestroyView(); } @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); } } 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); } searchImageRequest.setStart(0); refreshRequest = GoHttp.with(getActivity()).newRequest(searchImageRequest, new JsonHttpResponseHandler(SearchImageRequest.Response.class), new HttpRequest.Listener<SearchImageRequest.Response>() { @Override public void onStarted(HttpRequest httpRequest) { hintView.hidden(); } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, SearchImageRequest.Response responseObject, boolean b, boolean b2) { if (getActivity() == null) { return; } if (responseObject == null || responseObject.getImages() == null || responseObject.getImages().size() == 0) { hintView.failed(new HttpRequest.Failure(0, "咦,图片去哪儿了?"), new View.OnClickListener() { @Override public void onClick(View v) { pullRefreshLayout.startRefresh(); } }); new Handler().postDelayed(new Runnable() { @Override public void run() { pullRefreshLayout.stopRefresh(); } }, 500); } else { AssemblyRecyclerAdapter adapter = new AssemblyRecyclerAdapter(responseObject.getImages()); adapter.addItemFactory(new StaggeredImageItemFactory(SearchFragment.this)); adapter.setLoadMoreItem(new LoadMoreItemFactory(SearchFragment.this).fullSpan(recyclerView)); setAdapter(adapter); new Handler().postDelayed(new Runnable() { @Override public void run() { pullRefreshLayout.stopRefresh(); } }, 500); if (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 SearchImageRequest.ResponseHandler()).go(); } @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()); } @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(); } } } @Override public void onLoadMore(AssemblyRecyclerAdapter assemblyRecyclerAdapter) { searchImageRequest.setStart(adapter.getDataCount()); loadMoreRequest = GoHttp.with(getActivity()).newRequest(searchImageRequest, new JsonHttpResponseHandler(SearchImageRequest.Response.class), new HttpRequest.Listener<SearchImageRequest.Response>() { @Override public void onStarted(HttpRequest httpRequest) { } @Override public void onCompleted(HttpRequest httpRequest, HttpResponse httpResponse, SearchImageRequest.Response responseObject, boolean b, boolean b2) { if (getActivity() == null) { return; } List<StarImageRequest.Image> newImageList = null; if (responseObject.getImages() != null) { newImageList = new ArrayList<StarImageRequest.Image>(); for (SearchImageRequest.Image image : responseObject.getImages()) { newImageList.add(image); } } if (newImageList != null && newImageList.size() > 0) { adapter.addAll(newImageList); if (newImageList.size() < searchImageRequest.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 SearchImageRequest.ResponseHandler()).go(); } }