scrollview中嵌套多个listview解决每个listview只显示一个item

最近做一个项目,想要模仿现在市面上的比较好看的一个界面显示多个listview效果,如图:


大概就是这么个样子,许多app就是采用这种样式,还是挺好看的。

我自己也做了一个类似的,想法就是scrollView + listview. 但是在过程中我发现一个问题:每个listview只显示一个item,当时我就懵逼了,网上看了下资料,大概原因就是scrollview中嵌套listview后,无法正确计算listview的大小。

怎么解决呢?先来看看我的布局(find_layout.xml):

<?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="match_parent"
    android:weightSum="4"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#1cc019">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发现"
            android:textSize="15dp"
            android:textColor="#ffffff"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:id="@+id/textView"/>
    </RelativeLayout>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ListView
                android:id="@+id/find_listView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:dividerHeight="2px"
                android:divider="@color/light_gray">

            </ListView>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:background="@color/size_bg"/>

            <ListView
                android:id="@+id/find_listView_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:dividerHeight="2px"
                android:divider="@color/light_gray">

            </ListView>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:background="@color/size_bg"/>

            <ListView
                android:id="@+id/find_listView_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:dividerHeight="2px"
                android:divider="@color/light_gray">

            </ListView>
        </LinearLayout>

    </ScrollView>



</LinearLayout>
在scrollview里面嵌套3个listview。

再来看看代码:

public class FindFragment extends Fragment {

    ListView listView,listView_1,listView_2;
    int[] imgID = new int[] {R.mipmap.nav_challenge_1,R.mipmap.nav_path_1,
            R.mipmap.nav_cir_1,R.mipmap.nav_feed_1};
    String[] txt = new String[] {"挑战","足迹","社区","发现"};


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View findLayout = inflater.inflate(R.layout.find_layout, container, false);
        initViews(findLayout);
        return findLayout;
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {//一般非静态view才在这里面处理
        super.onActivityCreated(savedInstanceState);

        List<Map<String,Object>> listItems = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < imgID.length;i++) {
            Map<String,Object> listItem = new HashMap<String, Object>();
            listItem.put("image",imgID[i]);
            listItem.put("text", txt[i]);
            listItems.add(listItem);
        }
        SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), listItems, R.layout.simple_item_02,
                new String[]{"image","text"},
                new int[]{R.id.header_1,R.id.desc_1});
        listView.setAdapter(simpleAdapter);
        listView_1.setAdapter(simpleAdapter);
        listView_2.setAdapter(simpleAdapter);
        //解决scrollview中嵌套listview只显示一个item的问题
        setListViewHeightBasedOnChildren(listView);
        setListViewHeightBasedOnChildren(listView_1);
        setListViewHeightBasedOnChildren(listView_2);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position) {
                    case 0:
                        Toast.makeText(getActivity(),"挑战-01",Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        Toast.makeText(getActivity(),"挑战-02",Toast.LENGTH_SHORT).show();
                        break;
                    case 2:
                        Toast.makeText(getActivity(),"挑战-03",Toast.LENGTH_SHORT).show();
                        break;
                    case 3:
                        Toast.makeText(getActivity(),"挑战-04",Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });

    }
    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);
            // 计算子项View 的宽高
            listItem.measure(0, 0);
            // 统计所有子项的总高度
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // listView.getDividerHeight()获取子项间分隔符占用的高度
        // params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
    }


    private void initViews(View findLayout) {
        listView = (ListView)findLayout.findViewById(R.id.find_listView);
        listView_1 = (ListView)findLayout.findViewById(R.id.find_listView_1);
        listView_2 = (ListView)findLayout.findViewById(R.id.find_listView_2);
    }

    public void setMenuVisibility(boolean menuVisibility) {
        super.setMenuVisibility(menuVisibility);
        if (this.getView() != null) {
            this.getView().setVisibility(menuVisibility ? View.VISIBLE : View.GONE);
        }
    }
}
主要的处理就在

setListViewHeightBasedOnChildren(ListView listView)
这个方法里面了,重新计算了一下listview的空间。

来看看运行结果:




这样就成功了!其实还有一个办法,但是不能滑动,就是在scrollview中添加这个属性:android:fillViewport="true"

本文解决办法来自这篇博客:http://www.cnblogs.com/zhwl/p/3333585.html

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值