高度自适应
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.layoutParamsparams.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]// 配置listfun 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 = argumentsval 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 = mAdapterlistView.setOnItemClickListener(onClickListener)}
记录当前页面的位置
[code] var currentPage = 1var listPage = 1var lastItem = 0
页面切换时首先判断列表,下拉时才进行刷新
[code]val listener_1 = object : View.OnClickListener {override fun onClick(v: View?) {refreshTabs()tab_1.setTextColor(activity!!.getColor(R.color.bBlue))currentPage = 1val swipeView:SwipeRefreshLayout = activity!!.findViewById(R.id.index_swipe_layout)swipeView.isRefreshing = trueif (!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 = 1fetchLatestData(listPage)} else if(currentPage == 3){fetchHotData()} else if(currentPage == 4){fetchLikestData()}}