基本信息
源码名称:仿抖音流的图片浏览app
源码大小:3.82M
文件格式:.zip
开发语言:Java
更新时间:2019-02-28
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
仿抖音流的图片浏览app,可以不断下滑加载高兴图。预加载屏幕下方的图片。点击可看大图,可保存到本地。
仿抖音流的图片浏览app,可以不断下滑加载高兴图。预加载屏幕下方的图片。点击可看大图,可保存到本地。
| @BindContentView(R.layout.fragment_recycler) | |
| class UnsplashPhotosFragment : BaseFragment(), UnsplashPhotosItemFactory.UnsplashPhotosItemEventListener, OnLoadMoreListener, androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { | |
| private var adapter: AssemblyRecyclerAdapter? = null | |
| private var pageIndex = 1 | |
| private var backgroundImageUri: String? = null | |
| override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | |
| super.onViewCreated(view, savedInstanceState) | |
| recycler_recyclerFragment_content.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) | |
| refresh_recyclerFragment.setOnRefreshListener(this) | |
| if (adapter != null) { | |
| recycler_recyclerFragment_content.adapter = adapter | |
| } else { | |
| refresh_recyclerFragment.post { onRefresh() } | |
| } | |
| } | |
| override fun onUserVisibleChanged(isVisibleToUser: Boolean) { | |
| if (isVisibleToUser) { | |
| changeBackground(backgroundImageUri) | |
| } | |
| } | |
| private fun changeBackground(imageUri: String?) { | |
| this.backgroundImageUri = imageUri | |
| backgroundImageUri?.let { EventBus.getDefault().post(ChangeMainPageBgEvent(it)) } | |
| } | |
| private fun loadData(pageIndex: Int) { | |
| this.pageIndex = pageIndex | |
| NetServices.unsplash().listPhotos(pageIndex).enqueue(LoadDataCallback(this, pageIndex)) | |
| } | |
| override fun onClickImage(position: Int, image: UnsplashImage, optionsKey: String) { | |
| val activity = activity ?: return | |
| var finalOptionsKey: String? = optionsKey | |
| // 含有这些信息时,说明这张图片不仅仅是缩小,而是会被改变,因此不能用作loading图了 | |
| if (finalOptionsKey!!.contains("Resize") | |
| || finalOptionsKey.contains("ImageProcessor") | |
| || finalOptionsKey.contains("thumbnailMode")) { | |
| finalOptionsKey = null | |
| } | |
| @Suppress("UNCHECKED_CAST") | |
| val images = adapter!!.dataList as List<UnsplashImage> | |
| val imageArrayList = ArrayList<Image>(images.size) | |
| images.mapTo(imageArrayList) { Image(it.urls!!.regular!!, it.urls!!.raw!!) } | |
| ImageDetailActivity.launch(activity, dataTransferHelper.put("urlList", imageArrayList), finalOptionsKey!!, position) | |
| } | |
| override fun onClickUser(position: Int, user: UnsplashImage.User) { | |
| val uri = Uri.parse(user.links!!.html) | |
| .buildUpon() | |
| .appendQueryParameter("utm_source", "SketchSample") | |
| .appendQueryParameter("utm_medium", "referral") | |
| .appendQueryParameter("utm_campaign", "api-credit") | |
| .build() | |
| val intent = Intent(Intent.ACTION_VIEW) | |
| intent.data = uri | |
| startActivity(intent) | |
| } | |
| override fun onRefresh() { | |
| if (adapter != null) { | |
| adapter!!.loadMoreFinished(false) | |
| } | |
| if (!refresh_recyclerFragment.isRefreshing) { | |
| refresh_recyclerFragment.isRefreshing = true | |
| } | |
| loadData(1) | |
| } | |
| override fun onLoadMore(adapter1: AssemblyAdapter) { | |
| loadData(pageIndex 1) | |
| } | |
| private class LoadDataCallback internal constructor(fragment: UnsplashPhotosFragment, private val pageIndex: Int) : Callback<List<UnsplashImage>> { | |
| private val reference: WeakReference<UnsplashPhotosFragment> = WeakReference(fragment) | |
| init { | |
| if (pageIndex == 1) { | |
| fragment.hint_recyclerFragment.hidden() | |
| } | |
| } | |
| override fun onResponse(call: Call<List<UnsplashImage>>, response: Response<List<UnsplashImage>>) { | |
| val fragment = reference.get() ?: return | |
| if (!fragment.isViewCreated) { | |
| return | |
| } | |
| if (pageIndex == 1) { | |
| create(fragment, response) | |
| } else { | |
| loadMore(fragment, response) | |
| } | |
| fragment.refresh_recyclerFragment.isRefreshing = false | |
| } | |
| override fun onFailure(call: Call<List<UnsplashImage>>, t: Throwable) { | |
| val fragment = reference.get() ?: return | |
| val activity = fragment.activity ?: return | |
| if (!fragment.isViewCreated) { | |
| return | |
| } | |
| if (pageIndex == 1) { | |
| fragment.hint_recyclerFragment.failed(t, View.OnClickListener { fragment.onRefresh() }) | |
| fragment.refresh_recyclerFragment.isRefreshing = false | |
| } else { | |
| fragment.adapter!!.loadMoreFailed() | |
| Toast.makeText(fragment.activity, HintView.getCauseByException(activity, t), Toast.LENGTH_LONG).show() | |
| } | |
| } | |
| private fun create(fragment: UnsplashPhotosFragment, response: Response<List<UnsplashImage>>) { | |
| val activity = fragment.activity ?: return | |
| val images = response.body() | |
| if (images == null || images.isEmpty()) { | |
| fragment.hint_recyclerFragment.empty("No photos") | |
| return | |
| } | |
| val adapter = AssemblyRecyclerAdapter(images) | |
| adapter.addItemFactory(UnsplashPhotosItemFactory(activity, fragment)) | |
| adapter.setMoreItem(LoadMoreItemFactory(fragment)) | |
| fragment.recycler_recyclerFragment_content.adapter = adapter | |
| fragment.adapter = adapter | |
| fragment.changeBackground(images[0].urls!!.thumb) | |
| } | |
| private fun loadMore(fragment: UnsplashPhotosFragment, response: Response<List<UnsplashImage>>) { | |
| val images = response.body() | |
| if (images == null || images.isEmpty()) { | |
| fragment.adapter!!.loadMoreFinished(true) | |
| return | |
| } | |
| fragment.adapter!!.addAll(images) | |
| fragment.adapter!!.loadMoreFinished(images.size < 20) | |
| fragment.changeBackground(images[0].urls!!.thumb) | |
| } | |
| } | |
| } |