您的位置:首页 > 移动开发 > Android开发

创新实训博客(17)——Android开发中ListView高度自适应以及组件进阶使用

2020-07-14 06:21 871 查看

高度自适应

ListView是Android开发中非常常用的部分,在各种各样的APP中都有使用,不管是QQ的聊天列表,还是微信的公众号新闻列表。

在实际使用中,遇到了这样一个问题:

可能我希望ListView嵌套在ScrollView里面,而ScrollView中本身有很多其他的组件,这样形成一个整体。

但是实际使用时发现,只要把ListView放置在ScrollView中,高度就会变成只有一行,十分影响体验。

因此,决定自己手动写一个高度自适应的功能。

获取列表对象

[code]val listAdapter = recentView.adapter

遍历元素,添加高度

[code]for (i in 0 until listAdapter.count) {
val listItem = listAdapter.getView(i, null, recentView)
listItem.measure(0, 0)
totalHeight += listItem.measuredHeight
}

LayoutParams设置

[code]val params = recentView.layoutParams
params.height = totalHeight + (recentView.dividerHeight * (listAdapter.count - 1))
recentView.layoutParams = params

自动测量的效果

不同列表共用ListView

以首页界面为例子:

其实并不需要为每个标签分配一个Fragment,当需要点到某一个的时候,再进行处理。

但是有这样的一个问题,不能够直接设置List。

一方面是因为每个List的里面的元素类型不同,再一方面即使是类型相同的元素,他们的点击跳转也有可能不相同。

所以,我经过摸索,得出了一个比较不错的处理方案。

为每个列表分配List

[code]    var globalList = LinkedList<ArticleItem>()
var globalList_2 = LinkedList<ArticleItem>()
var globalList_3 = LinkedList<TopItem>()
var globalList_4 = LinkedList<TopItem>()

设置Adapter和List元素

[code]// 配置list
fun setLikestList(list: LinkedList<TopItem>) {
val mAdapter = TopItemAdapter(list, activity)
// 监听器
val onClickListener = object : AdapterView.OnItemClickListener{
override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val bundle = arguments
val token = bundle!!.getString("token").toString()
val blogIntent = Intent(activity, BlogActivity::class.java)
blogIntent.putExtra("id", list.get(position).id)
blogIntent.putExtra("token", token)
startActivity(blogIntent)
}
}
val listView = activity!!.findViewById<ListView>(R.id.index_blog_list)
listView.adapter = mAdapter
listView.setOnItemClickListener(onClickListener)
}

记录当前页面的位置

[code]    var currentPage = 1
var listPage = 1
var lastItem = 0

页面切换时首先判断列表,下拉时才进行刷新

[code]val listener_1 = object : View.OnClickListener {
override fun onClick(v: View?) {
refreshTabs()
tab_1.setTextColor(activity!!.getColor(R.color.bBlue))
currentPage = 1
val swipeView:SwipeRefreshLayout = activity!!.findViewById(R.id.index_swipe_layout)
swipeView.isRefreshing = true
if (!globalList.isEmpty()) {
setSubList(globalList)
swipeView.isRefreshing = false
} else {
fetchSubData()
}
}
}

下拉刷新的时候,判断当前页面

[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 = 1
fetchLatestData(listPage)
} else if(currentPage == 3){
fetchHotData()
} else if(currentPage == 4){
fetchLikestData()
}
}

实现的效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐