Android ListView的每一个item布局高度不一样,自动计算listView高度

た 入场券 2022-12-05 15:20 449阅读 0赞

一、android listView的每一个item布局高度不一样

1.获取listView的宽度

2.给item的measure设置参数是listView的宽度就可以获取到真正每一个item的高度

  1. public void setListViewHeightBasedOnChildren(ListView listView1) {
  2. BaseAdapter listAdapter = (BaseAdapter) listView1.getAdapter();
  3. if (listAdapter == null) {
  4. return;
  5. }
  6. int totalHeight = 0;
  7. //获取listView的宽度
  8. ViewGroup.LayoutParams params = listView1.getLayoutParams();
  9. int listViewWidth = getActivity().getWindowManager().getDefaultDisplay().getWidth();
  10. int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
  11. for (int i = 0; i < listAdapter.getCount(); i++) {
  12. View listItem = listAdapter.getView(i, null, listView1);
  13. //给item的measure设置参数是listView的宽度就可以获取到真正每一个item的高度
  14. listItem.measure(widthSpec, 0);
  15. totalHeight += listItem.getMeasuredHeight();
  16. }
  17. params.height = totalHeight
  18. + (listView1.getDividerHeight() * (listAdapter.getCount() + 1));
  19. listView1.setLayoutParams(params);
  20. }

实例:

  1. /**
  2. * 初始化列表
  3. */
  4. private void initListView() {
  5. List<CommentInfo> list = new ArrayList<>();
  6. for (int i = 0; i < 8; i++) {
  7. CommentInfo info;
  8. if(i%2==0){
  9. info = new CommentInfo("idddx" + i, "2020-09-10 18:00:00", "快递师傅奇偶的实际发生了的会计法反倒是咖", 3.6f);
  10. }else{
  11. info = new CommentInfo("idddx" + i, "2020-09-10 18:00:00", "快递师傅奇偶的实际发生了的会计法反倒是咖啡机收到啦反馈撒酒疯发送卡打了飞机撒飞机撒来得快dsfsdafsdaf倒是咖啡机收到啦反馈撒酒疯发送卡打了飞机撒飞机撒来得", 4.3f);
  12. }
  13. list.add(info);
  14. }
  15. m_listAdapter = new CommentListAdapter(this, list);
  16. m_listView.setAdapter(m_listAdapter);
  17. //setListViewHeight(m_listView, m_listAdapter); //item高度测量不准确,如果每个item高度一样,可以使用该方法
  18. setListViewHeightBasedOnChildren(m_listView); //item高度测量准确,当每个item高度不一样时,使用该方法
  19. }
  20. /**
  21. * 根据列表项的个数,设定listView的高度
  22. */
  23. protected void setListViewHeight(ListView listView, CommentListAdapter adapter) {
  24. try {
  25. int totalHeight = 0;
  26. for(int i = 0; i < adapter.getCount(); i++) {
  27. View viewItem = adapter.getView(i, null, listView);
  28. viewItem.measure(0, 0);
  29. totalHeight += viewItem.getMeasuredHeight();
  30. }
  31. ViewGroup.LayoutParams params = listView.getLayoutParams();
  32. params.height = totalHeight + (listView.getDividerHeight() * (listView.getCount() - 1));
  33. listView.setLayoutParams(params);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. /**
  39. * 根据列表项的个数,设定listView的高度
  40. */
  41. public void setListViewHeightBasedOnChildren(ListView listView1) {
  42. BaseAdapter listAdapter = (BaseAdapter) listView1.getAdapter();
  43. if (listAdapter == null) {
  44. return;
  45. }
  46. int totalHeight = 0;
  47. //获取listView的宽度
  48. ViewGroup.LayoutParams params = listView1.getLayoutParams();
  49. int listViewWidth = this.getWindowManager().getDefaultDisplay().getWidth();
  50. int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
  51. for (int i = 0; i < listAdapter.getCount(); i++) {
  52. View listItem = listAdapter.getView(i, null, listView1);
  53. //给item的measure设置参数是listView的宽度就可以获取到真正每一个item的高度
  54. listItem.measure(widthSpec, 0);
  55. totalHeight += listItem.getMeasuredHeight();
  56. }
  57. params.height = totalHeight
  58. + (listView1.getDividerHeight() * (listAdapter.getCount() + 1));
  59. listView1.setLayoutParams(params);
  60. }

完!!!

发表评论

表情:
评论列表 (有 0 条评论,449人围观)

还没有评论,来说两句吧...

相关阅读