`
天天向上1989
  • 浏览: 419311 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

【转】在ScrollView中加入ListView时

阅读更多

在ScrollView中加入ListView时,有个很棘手的BUG,就只能显示出ListView的一行半左右。

 

ListView 本来是不应该 放在 ScrollView 里的,Google员工 Roman Guy早已回复:

"There is no need to put a ListView in a ScrollView since ListView already supports scrolling. Do NOT put a ListView inside a ScrollView. ListView already handles scrolling, you’re only going to run into trouble. "

 

我当然是不想自找麻烦,把ListView往ScrollView里面加的,但是项目中有这个需求。

 

大致发现有以下几种方法:

法一:

 

一个Activity,其中不只有ListView一个控件,还有其他的TextView、ImageView、Button等等很多控件,这样很可能会 占据屏幕很大一部分,要知道手机的屏幕只有480像素,通常的想法是给这个Activity加上一个ScrollView,让其有滚动条,但是会发现 ListView的高度不是随着内容而自动填充的。那么我们可以使用ListView的addHeaderView 以及addFooterView 为ListView增加上下的头和尾,这样就可以让ListView填充到整个屏幕。

 

步骤:

1) 新建一个Layout:   demo_list_item_header_view.xml:

<linearlayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content">  

    <textview 
                android:text="TestListViewHeader"
                android:id="@+id/headerTextView" 
                android:textsize="20sp" 
                android:layout_width="wrap_content"
                android:layout_height="30sp">  
    </textview>  
</linearlayout>  

 

2) 新建一个类,继承自LinearLayout用来显示上面的Layout:

      DemoListHeaderView.java

 

package com.zhang.test.view;

import com.zhang.test.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class DemoListHeaderView extends LinearLayout {

	private static final String TAG = "DemoListHeaderView";
	private Context context;
	private TextView textView;

	public DemoListHeaderView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initialize(context);
	}

	public DemoListHeaderView(Context context) {
		super(context);
		initialize(context);
	}

	private void initialize(Context context) {
		this.context = context;
		View view = LayoutInflater.from(this.context).inflate(R.layout.demo_list_item_header_view, null);
		textView = (TextView) view.findViewById(R.id.headerTextView);
		addView(view);
	}

	public void setTextView(String text) {
		textView.setText(text);
	}
}

 

之后在ListView设置setAdapter之前,一定要在setAdapter之前
加上代码:

        DemoListHeaderView headerView = new DemoListHeaderView(context);
        headerView.setTextView("Header : ");
        listView.addHeaderView(headerView);

        DemoListHeaderView footerView = new DemoListHeaderView(context);
        footerView.setTextView("Footer : ");
        listView.addFooterView(footerView);

 

全部:

package com.zhang.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;

import com.zhang.test.view.DemoListHeaderView;
import com.zhang.test.view.DemoListItemView;
import com.zhang.test.view.adapter.DemoListAdapter;

public class demoActivity extends Activity {

	private static final String TAG = "demoActivity";
	private Context context;
	private ListView listView;
	private ArrayList<demolistitemview.data> datas;
	private DemoListAdapter datasAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = this;
        listView = (ListView) findViewById(R.id.listView);
        datas = new ArrayList<demolistitemview.data>();
        loadData();
        datasAdapter = new DemoListAdapter(context, datas);

        DemoListHeaderView headerView = new DemoListHeaderView(context);
        headerView.setTextView("Header : ");
        listView.addHeaderView(headerView);

        DemoListHeaderView footerView = new DemoListHeaderView(context);
        footerView.setTextView("Footer : ");
        listView.addFooterView(footerView);

        listView.setAdapter(datasAdapter);
    }

    private void loadData() {
    	DemoListItemView.Data d;
    	for(int i=0; i<10; i++) {
    		d = new DemoListItemView.Data();
    		d.topText = "测试top";
    		d.bottomText = "测试bottom";
    		datas.add(d);
    	}
    }
}
分享到:
评论
4 楼 NickRambo 2012-03-24  
如果haedview或者footerview里面是listview,也能这样实现吗?相当于两到三个listview线性排列下来……  我试了下 无论是把新的listview当做headview加进以后listview,还是当做footerview加进去,都无法完全显示,只会显示一条记录。这是什么情况?有好的解决方法么?
3 楼 天天向上1989 2011-09-05  
javajava00001 写道
demoActivity 和DemoListHeaderView 是联系吗?
</demolistitemview.data></demolistitemview.data> 里面又有什么啊??

  
2 楼 javajava00001 2011-09-01  
demoActivity 和DemoListHeaderView 是联系吗?
</demolistitemview.data></demolistitemview.data> 里面又有什么啊??
1 楼 javajava00001 2011-09-01  
楼主,你这样写我真的看不懂,

相关推荐

    时间轴和ScrollView的嵌套Listview及布局隐藏

    在本项目中,我们探讨的是如何在一个ScrollView中嵌套一个ListView来实现自定义的时间轴,同时涉及到布局的动态显示与隐藏。这种设计模式常见于长篇内容展示或历史记录的场景,例如日志、活动流等。 首先,我们来...

    Android PullToRefresh 下拉刷新,上拉更多,支持ScrollView,ListView,可方便拓展GridView,WebView等

    Android PullToRefresh 下拉刷新,上拉更多,支持ScrollView,ListView,可方便拓展GridView,WebView等,我主要测试了ScrollView,ListView代码中已实现不过没怎么测,其他的还是很好拓展的的,在isReadyForPullUp...

    上拉下拉刷新,支持ListView,GridView,ScrollView

    在Android的UI组件中,ListView和GridView通常用于展示大量的数据,而ScrollView则适用于单个视图的滚动。然而,原生的这些组件并不内置上拉下拉刷新的功能。`ZrcListView`通过封装和扩展这些组件,实现了这个实用...

    商城首页一键回到顶部功能实现(包括ListView, RecyclerView 和 ScrollView)

    以下我们将详细探讨如何在ListView、RecyclerView和ScrollView中实现这一功能。 首先,我们来看ListView的实现。ListView是Android早期常用的列表控件,它可以动态加载数据并进行滚动。要添加一键回到顶部的功能,...

    Android下拉刷新控件(ListView好ScrollView版).zip

    3. **ListView的适配器**:在实现下拉刷新时,可能需要更新`ListView`的数据源,这就涉及到对Adapter的操作。适配器负责将数据转化为列表项视图,并将其绑定到`ListView`上。在刷新完成后,我们可以通过`adapter....

    Android中ListView结合CheckBox获取选中项.rar

    本示例"Android中ListView结合CheckBox获取选中项.rar"旨在教授如何在ListView中集成CheckBox,并有效地获取用户选择的数据。 1. **ListView基本使用** - ListView是一个可以滚动的视图,它能显示一行行的数据。...

    ScrollView增加标题控制显示和隐藏

    通过以上步骤,我们就成功地在ScrollView中实现了标题显示和隐藏的功能,并且在切换过程中加入了动画效果。这个功能可以应用于各种需要动态控制标题显示的应用场景,提高了用户体验和界面的灵活性。在实际开发中,...

    Android 中 GridView嵌套在ScrollView里只有一行的解决方法

    总结来说,解决Android中GridView嵌套在ScrollView里只显示一行的问题,可以通过计算子项高度并设置ListView或GridView的高度,或者重写它们的onMeasure方法来实现。这两种方法都可以有效地让ScrollView正确滚动到...

    ListView 标题置顶实现

    标题置顶是指当用户滚动ListView时,某个特定的标题项(通常对应一个数据分组)会固定在屏幕顶部,即使在列表滚动过程中,这个标题依然可见,直到下一个标题出现并将其替换。这使得用户在浏览长列表时能清晰地识别...

    Android开发基于ScrollView实现的渐变导航栏效果示例

    前些日子项目要在原来的页面上加入渐变导航栏的功能,查了很多资料,很多资源都是监听到listview的高度来实现渐变导航栏的效果,可是项目里面很多的界面都是使用ScrollView来实现滑动效果。 实在没办法,就自己写了...

    下拉刷新上拉加载更多

    在本示例中,我们将关注如何仿照新浪微博实现这一特性,并且加入自定义动画效果。 1. **下拉刷新(Pull-to-Refresh)机制** 下拉刷新通常通过一个可滚动视图(如ScrollView、ListView或RecyclerView)来实现。当...

    Android代码-all-base-adapter

    现在也加入了DataBinding用的BaseAdapter。 Related posts: 相关博文: ViewGroup 篇 封装博文 DataBinding 篇 封装博文 If you like, point a star .Thank you very much! 喜欢随手点个star 多谢 The ultimate

    android 软键盘把界面顶起

    如果没有效果,可以在 layout 布局中父控件中加入 android:layout_width="fill_parent" 和 android:layout_height="fill_parent" 属性。 解决软键盘覆盖界面问题可以通过在布局之外添加一层 &lt;ScrollView&gt; 来实现。 ...

    android Scroll滚动

    在Android开发中,`Scroll` 是一个非常关键的机制,它允许用户通过触摸屏幕来滚动内容,例如在ListView、ScrollView或者ViewPager中。本篇将详细探讨Android中的滚动机制,特别是如何通过Scroll实现ViewGroup的滚动...

    android 手势导致页面滑动

    这通常发生在`ScrollView`、`ListView`或`ViewPager`等可以滚动的视图组件中。当用户进行非滚动意图的手势操作时,如果这些组件错误地捕获了手势,就会导致意外的页面滑动。为了避免这种情况,开发者需要精细地控制...

    自定义SwipeRefreshLayout,带下来刷新和底部加载功能

    在Android开发中,SwipeRefreshLayout是谷歌提供的一种标准的下拉刷新控件,它通常与RecyclerView或ListView等列表组件配合使用,允许用户通过从顶部向下滑动来触发刷新操作。在这个自定义版本中,开发者不仅保留了...

    Cocos Creator 实现的tableView列表demo

    在Cocos Creator中,通过自定义组件或使用内置的ScrollView组件,可以实现类似iOS中的UITableView或者Android上的RecyclerView的功能。 2. **回收机制**:为了提高性能,TableView实现了一个对象池(Pool)的概念。...

    瀑布流学习

    在提供的代码片段中,开发者自定义了一个名为`MyScrollView`的类,继承自ScrollView。这个类的主要功能是实现瀑布流布局的滑动监听和处理逻辑。 1. **属性介绍**: - `View view`:表示当前布局视图。 - `Handler...

    自定义控件-pulltorefresh

    "pulltorefresh"通常与ListView、ScrollView或者RecyclerView等滚动视图结合,以便在数据需要更新时提供直观的用户体验。 在描述中提到的"简单到谁都能看懂"意味着这个实现可能具有良好的可读性和易用性,对于...

Global site tag (gtag.js) - Google Analytics