尝试用kotlin做一个app(十二)

匆匆过客 提交于 2020-03-09 08:57:00

新闻列表页下拉刷新

1.使用谷歌官方的SwipeFreshLayout控件

简单使用

用<androidx.swiperefreshlayout.widget.SwipeRefreshLayout></androidx.swiperefreshlayout.widget.SwipeRefreshLayout>包裹RecyvlerView

设置颜色

swipeRefreshLayout.setColorSchemeColors(Color.GRAY)可以添加多种颜色

设置监听

swipeRefreshLayout.setOnRefreshListener {
            var pos:Int=this.intent.getStringExtra("posi").toInt()
            swipeRefreshLayout.isRefreshing=false

        }

新闻列表页上拉加载更多

思路是,在RecyclerView中新增一个item,判断如果Recycler滚动到最后一个item。从数据库读取更多数据,添加到原来的新闻列表的末尾。

创建一个布局的类LoadMoreView

class LoadMoreView:RelativeLayout{
    constructor(context: Context):super(context)
    constructor(context: Context,attrs: AttributeSet):super(context,attrs)
    constructor(context: Context,attrs: AttributeSet,defStyleAttr:Int):super(context,attrs,defStyleAttr)
    init{
        View.inflate(context, R.layout.view_loadmore,this)
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center">
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

在新闻列表的adapter中,返回articleList.size+1条数据,最后的位置设置为LoadMoreView

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        if(viewType==TYPE_NORMAL)
            return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.newslist_item,parent,false))
        else
            return MyViewHolder(LoadMoreView(parent.context))
    }

在NewsListActivity中添加一下对RecyclerView的监听事件

rv_newslist.addOnScrollListener(object :RecyclerView.OnScrollListener(){
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if(newState==RecyclerView.SCROLL_STATE_IDLE) {
                    val layoutManager=recyclerView.layoutManager
                    if(layoutManager is LinearLayoutManager){
                        val manager:LinearLayoutManager=layoutManager
                        val lastPosition=manager.findLastVisibleItemPosition()
                        if(lastPosition==adapter.itemCount-1){
                            //println("最后一条")
                            //计算page
                            loadMore(pos!!,adapter.itemCount-1)
                        }
                    }
                }
            }
        })

 //loadMore

private fun loadMore(pos: Int,offset:Int) {

        var rows = 10
        var page=offset/rows+1
        if(offset%rows>0) page+=1
        println("offset:$offset,offset${offset+(rows-offset%rows)}")
        var url =
            "http://~/JustTest/getArticle?page=" + page + "&rows=" + rows + "&pos=" + pos
        println(url)
        var client = OkHttpClient()
        var request = Request.Builder().get().url(url).build()
        var resp: Response? = null
        Thread {
            Looper.prepare()
            resp = client.newCall(request).execute()
            var result = resp!!.body?.string()
            //Toast.makeText(this,result,Toast.LENGTH_SHORT).show()
            var gson = Gson()
            var articleList: ArticleBeen = gson.fromJson(result, ArticleBeen::class.java)
            //Toast.makeText(this,articleList.article[7].toString(),Toast.LENGTH_SHORT).show()
            runOnUiThread {
                adapter.loadMore(articleList.article)
            }
            Looper.loop()
        }.start()

    }

//adapter.loadMore

fun loadMore(articleList:ArrayList<Article>){
        this.articleList.addAll(articleList)
        notifyDataSetChanged()
    }

 新闻列表条目点击事件,以及点击进入新闻详情页

 这个跟展示首页新闻列表的新闻详情页是一样的了。这里不重复记录了。另外,可以给新闻详情页加一个toolbar,增加一个分享的功能

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!