• ScrollView与ListView的冲突问题


    今天在实现ScrollView中嵌套多个ListView的时候,出现了ListView不能正常显示的情况,总结下遇到的问题以及解决方案。

    • ScrollView can host only one direct child

      在往ScrollView中添加子项的时候往往是多个子项一起添加的,但是系统会提示错误。

      这是因为ScrollView中只能有一个子项,所以这里我将所有的子项全部放在一个Layout中。

      

     <ScrollView
            android:id="@+id/ScrollView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#ffffffff"
            android:scrollbars="vertical" >
    
            <LinearLayout
                android:id="@+id/tmall"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="文本备忘"
                    android:textSize="28sp" />
    
                <ListView
                    android:id="@+id/listview0"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="智能备忘"
                    android:textSize="28sp" />
    
                <ListView
                    android:id="@+id/listview1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content" />
            </LinearLayout>
        </ScrollView>
    • ListView只显示一行多一点

      这个我的解决方法是参考网络上的做法,通过给ListView设置LayoutParams属性来改变。

    public class ListViewUtils {
        public void setListViewHeightBasedOnChildren(ListView listView) {
            // 获取ListView对应的Adapter
            ListAdapter listAdapter = listView.getAdapter();
            if (listAdapter == null) {
                return;
            }
    
            int totalHeight = 0;
            for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
                View listItem = listAdapter.getView(i, null, listView);
                listItem.measure(0, 0); // 计算子项View 的宽高
                totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
            }
    
            ViewGroup.LayoutParams params = listView.getLayoutParams();
            params.height = totalHeight
                    + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
            // listView.getDividerHeight()获取子项间分隔符占用的高度
            // params.height最后得到整个ListView完整显示需要的高度
            listView.setLayoutParams(params);
        }
    }

      然后只要在初始化listview后使用就行了

    private void initView() {
            textListView = (ListView) findViewById(R.id.listview0);
            intelListView = (ListView) findViewById(R.id.listview1);
            
            textListView.setAdapter(new MyTestAdapter(this));
            intelListView.setAdapter(new MyTestAdapter(this));
            
            new ListViewUtils().setListViewHeightBasedOnChildren(textListView);
            new ListViewUtils().setListViewHeightBasedOnChildren(intelListView);
        }

      到此,问题基本解决

      ps:这是我的第一篇博客,多有不足,希望读者能多给建议

      

      本文参考自:http://jackxlee.blog.51cto.com/2493058/666475

  • 相关阅读:
    程序员无休止加班的真正原因!
    Tomcat 爆出高危漏洞!
    Spring Boot 2.3 终于要来了!
    2020 年 4月全国程序员工资出炉!
    面试官再问你如何看待义务加班,学会如何怼回去!
    如何在一分钟内搞定面试官?
    安装android studio时,解决unable to access android sdk add-on list
    poj 3230 Travel(dp)
    hdu 2059 龟兔赛跑(dp)
    解决未能启动服务“VMware Authorization Service”
  • 原文地址:https://www.cnblogs.com/kkrimen/p/3012660.html
Copyright © 2020-2023  润新知