Android 中 关于嵌套 ListView 的写法

来源:互联网 发布:tensorflow版本查看 编辑:程序博客网 时间:2024/04/27 19:50

平时 Android 开发过程中,我们偶尔的会遇到一些关于在 ListView 嵌套一层 ListView , ScrollView 嵌套一层 ListView,网上也有很多针对不同情况的处理方式,常见的就是 继承一个 ListView 然后重写其 绘制方法。

这种写法 在 ScrollView 中导致的情况就是,如果我 ListView 上面还有其他布局,那么界面初始化的时候,会直接显示在我们重写了 绘制方法的 ListView 位置,必须要往下滑动一下,才能看到上面的界面。这个时候就需要去设置一下 ScrollView 的滚动位置了。这样用起来感觉也是不好控制。

今天这里就介绍一种比较方便,在项目中使用效果相对较好的嵌套 ListView 的写法,
我这里是使用 ListView 实现 二级列表的效果,先看一下效果图:
这里写图片描述

这里只是介绍一下写法,所以样式什么的大家不要在意。

我这里的数据源是一个二级列表,主界面是一个 ListView,来看一下我们的 getView 方法实现:

 @Override    public View getView(int i, View view, ViewGroup viewGroup) {        if (view == null) {            view = LayoutInflater.from(context).inflate(R.layout.item_group, viewGroup, false);        }        TextView tv_groupName = ViewHolder.get(view, R.id.tv_groupName);        CusListView listView = ViewHolder.get(view, R.id.cus_listView);        Group item = getItem(i);        tv_groupName.setText(item.getGroupName());        listView.setList(item.getMembers());        return view;    }

ViewHolder 类 前面有博客介绍过了写法,这里不多说了。通过 getView 里面可以看到,二级效果主要是一个 CusListView 实现的,那么这个 CusListView 是如何实现的呢,结果马上揭晓:

public class CusListView extends LinearLayout {    public CusListView(Context context) {        this(context, null);    }    public CusListView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CusListView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        setOrientation(VERTICAL);    }    public void setList(List<User> list) {        if (list == null) {            throw new RuntimeException("list is null");        }        int count = list.size();        removeAllViews();        for (int i = 0; i < count; i++) {            User user = list.get(i);            View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_nested_item, null);            TextView tv_name = f(view, R.id.tv_name);            TextView tv_age = f(view, R.id.tv_age);            tv_name.setText(user.getUserName());            tv_age.setText(user.getUserAge() + "");            addView(view);        }    }    private <T extends View> T f(View view, int id) {        return (T) view.findViewById(id);    }}

其实就是一个 LinearLayout 而已。哈哈哈,有没有被它的名字所迷惑? 这里就是通过动态的给 LinearLayout 添加子元素,来实现的一种 ListView 的效果。 这样的写法在 ScrollView 嵌套ListView 中就可以避免 我们通过重写 ListView 的绘制方法所造成的 初始化显示在 ListView 位置的那个问题。

代码太简单。主要是告诉大家有这么个写法而已。

Demo下载

0 0
原创粉丝点击