Google官方提供的组件
SwipeRefreshLayout:只有下拉刷新,没有上拉加载更多的功能
不过也足够用,首先实现下拉刷新
OnRefreshListener
需要重写其中的下拉刷新函数
因为我是在首页的第一个Fragment中执行,而这里面有三个不同的页面。
首先我应该判断是哪一个页面,然后执行对应的操作。
[code] val onRefreshListener = SwipeRefreshLayout.OnRefreshListener {// 向上到顶部// Toast.makeText(activity, \"正在刷新...\", Toast.LENGTH_SHORT).show()if(currentPage == 1){fetchSubData()} else if(currentPage == 2){globalList_2 = LinkedList<ArticleItem>()listPage = 1fetchLatestData(listPage)} else if(currentPage == 3){fetchHotData()}}
遇到的问题
遇到了一个错误,The content of the adapter has changed but ListView did not receive a notification。
这个问题出现的原因是,我在子线程中修改了数据,而这部分数据在没有外面套着下拉刷新的这个组件的时候是完好的,但是因为有了外部的这个组件,因此我需要把这个给他写在主线程里,使用handler。
解决方案
[code] val handler = @SuppressLint(\"HandlerLeak\")object : Handler() {override fun handleMessage(msg: Message) {super.handleMessage(msg)if (msg.what == 1) {setSubList(globalList)val swipeView:SwipeRefreshLayout = activity!!.findViewById(R.id.index_swipe_layout)swipeView.isRefreshing = false}
AbsListView.OnScrollListener
然后实现上拉加载,需要设置这么一个监听器。
判断上拉到底
[code] // 上拉fun onScrollRefresh(){val listView:ListView = activity!!.findViewById(R.id.index_blog_list)val onScrollChangeListener = object: AbsListView.OnScrollListener {override fun onScroll(view: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {if ((firstVisibleItem + visibleItemCount) == totalItemCount) {val lastVisibleItemView = view!!.getChildAt(view.childCount - 1)if (lastVisibleItemView != null && lastVisibleItemView.bottom == view.height) {// 向下到底部if (currentPage == 2) {Toast.makeText(activity, \"正在加载...\", Toast.LENGTH_SHORT).show()listPage += 1fetchLatestData(listPage)}}}// 更新positionlastItem = firstVisibleItem}override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {}}listView.setOnScrollListener(onScrollChangeListener)}
实现的效果示意图