`
mmdev
  • 浏览: 12914464 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

android 解决ScrollView与ListView的冲突(TableLayout+ScrollView)

 
阅读更多

首先对于ScrollView和ListView这两个控件发生冲突我就不过多解释了,用过的同学们都知道,

问题:ListView在ScrollView显示一行半,解决方法:http://jackxlee.blog.51cto.com/2493058/666475这里有解决办法.不过实现后会发现,效果不是很友好,首先由别的界面跳转至该界面的时候,listview显示的不正常,

第一:显示顺序不对。第二:scrollView显示不再最上面,而是现在在listview的中间,这点肯定不被认可.解决办法:scrollTo(0,0);不过这个方法必须要用handler实现:

mHandler.post(new Runnable() {

@Override
public void run() {
((ScrollView)findViewById(R.id.main_sv)).scrollTo(10, 10) ;
}
});

实现后结果会发现:在listview 初始化完以后,屏幕会一闪,其实就是由listview 的中间再次scrollTo顶部。效果很不友好.

本人正在开发新浪微博一些应用,新浪微博的评论列表显示的时候根本没有遇到上述情况,也许是自己比较笨吧,不知道该怎么实现,不过之前做过简单的动态Taable的应用,想想就一个一个生成吧,麻烦也好,起码可以实现.

下面是代码片段:

public void tableList(Context context, ArrayList<BlogInfo> blogInfos) {

		TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(
				android.widget.TableRow.LayoutParams.FILL_PARENT,
				android.widget.TableRow.LayoutParams.FILL_PARENT);
		AsyncImageLoader asyncImageLoader = new AsyncImageLoader();
		View convertView = null;
		for (int i = 0; i < blogInfos.size(); i++) {
			TableRow tableRow = new TableRow(context);
			final ViewHolder holder = new ViewHolder();

			convertView = LayoutInflater.from(context).inflate(
					R.layout.blogdetail_item, null);
			holder.imageLog = (ImageView) convertView
					.findViewById(R.id.iv_blogdetail_item);
			holder.textName = (TextView) convertView
					.findViewById(R.id.tv_blogtetail_item_name);
			holder.textComment = (TextView) convertView
					.findViewById(R.id.tv_blogdetail_item_content);
			holder.textTime = (TextView) convertView
					.findViewById(R.id.tv_blogdetail_item_time);

			holder.textName.setText(blogInfos.get(i).Title);
			holder.textComment.setText(blogInfos.get(i).Content);
			holder.textTime
					.setText(MyUtil.convertTime(blogInfos.get(i).Time, 1));

			Drawable drawable = asyncImageLoader.loadDrawable(
					blogInfos.get(i).LogImage, new ImageCallback() {
						@Override
						public void imageLoaded(Drawable imageDrawable,
								String imageUrl) {
							if (imageDrawable != null) {
								holder.imageLog.setImageDrawable(imageDrawable);
							} else {
								holder.imageLog
										.setImageResource(R.drawable.u6_normal);
							}

						}
					});
			if (drawable != null) {
				holder.imageLog.setImageDrawable(drawable);
			}

			tableRow.addView(convertView, layoutParams);
			tb_blogdetail.addView(tableRow);
		}

	}

其实很简单,就是创建了一个View作为TableRow,把数据一个一个的填充进去,获取有些同学会发现这个效率很低,早N年前google就提出来了要创建一个类ViewHolder,用于减少findbyId的使用,可是我一用就报错,错误信息如下:

The specified child already has a parent.You must call removeView() on the child's parent first.

这个应该可以提高性能,本人水平有限,知道的朋友麻烦解释下.

下面效果如图:

Listview 加载中... Listview加载完毕. 下拉Listview.

TableLayout+ScrollView 很好的解决了Listview和ScrollView之间的冲突.虽说我写的性能不高,但是显示这些内容足够了,效果如同新浪微博一样,呵呵,就说这么多了。有什么不足之处,或更好的解决方案:请您留吉言.




方法二:(动态修改ListView的高度,切记:在使用ScrollView嵌套ListView布局的时候,中间一定要加一个LinearLayout或者什么的布局,不然效果出不来,原因不明,总之知道如何就OK了.

例如:

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none" >

      <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:padding="20dp" >

            <com.jj.corner.MyListView
                android:id="@+id/mylistview_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="20dp"
                android:layout_marginTop="20dp"
                android:background="@drawable/list_default_round"
                android:cacheColorHint="#00000000" />
        </LinearLayout>
    </ScrollView>

动态修改ListView高度方法:

/***
	 * 动态设置listview的高度
	 * 
	 * @param listView
	 */
	public void setListViewHeightBasedOnChildren(ListView listView) {
		ListAdapter listAdapter = listView.getAdapter();
		if (listAdapter == null) {
			return;
		}
		int totalHeight = 0;
		for (int i = 0; i < listAdapter.getCount(); i++) {
			View listItem = listAdapter.getView(i, null, listView);
			listItem.measure(0, 0);
			totalHeight += listItem.getMeasuredHeight();
		}
		ViewGroup.LayoutParams params = listView.getLayoutParams();
		params.height = totalHeight
				+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
		// params.height += 5;// if without this statement,the listview will be
		// a
		// little short
		// listView.getDividerHeight()获取子项间分隔符占用的高度
		// params.height最后得到整个ListView完整显示需要的高度
		listView.setLayoutParams(params);
	}





分享到:
评论

相关推荐

    android开发揭秘PDF

    4.2.18 卷轴视图(ScrollView) 4.2.19 进度条(ProgressBar) 4.2.20 拖动条(SeekBar) 4.2.21 状态栏提示(Notification、NotificationManager) 4.2.22 对话框中的进度条(ProgressDialog) 4.3 界面布局 4.3.1 垂直线性...

    android开发demo集合

    2、TableLayout 3、FrameLayout 霓虹灯效果 4、RelativeLayout 梅花效果 5、自定义view跟着触点走的小球 6、 ListView 列表视图 7、WebView web视图 8、ToggleButton 动态布局效果 9、AnalogClock 、 DigitalClock...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    Android开发案例驱动教程 配套代码

    8.4.1 Android线程应用中的问题与分析 164 8.4.2 Message和MessageQueue 169 8.4.3 Handler 169 8.4.4 Looper和HandlerThread 172 本章小结 178 第9章 Activity和Intent 179 9.1 Activity 179 9.1.1 创建...

    android初学者入门项目

    2、TableLayout 3、FrameLayout 霓虹灯效果 4、RelativeLayout 梅花效果 5、自定义view跟着触点走的小球 6、 ListView 列表视图 7、WebView web视图 8、ToggleButton 动态布局效果 9、AnalogClock 、 DigitalClock...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    《Android应用开发揭秘》源码

     4.2.18 卷轴视图(ScrollView)  4.2.19 进度条(ProgressBar)  4.2.20 拖动条(SeekBar)  4.2.21 状态栏提示(Notification、NotificationManager)  4.2.22 对话框中的进度条(ProgressDialog)  4.3 界面布局  ...

    Android入门到精通源代码.

    《Android从入门到精通》 第1章 初识Android 1.1 什么是Android 1.1.1 移动信息设备分类 1.1.2 Open Handset Alliance和 Android 1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术...

    Android基础知识详解

    Android的系统架构 6 一、应用程序 6 二、应用程序框架 6 三、Android Runtime 7 四、系统库 7 五、Linux 内核 8 Webkit浏览器引擎简介 9 Dalvik虚拟机简介 11 什么是Dalvik虚拟机 11 Dalvik和Android系统 11 Dalvik...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    《疯狂Android讲义(第2版)》.(李刚).源代码 疯狂Android讲义目录结构: 第2章、Android应用程序界面设计,即View 2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本...

    Android知识点及重要代码合集 word文档

    1.1掌握Android四层体系架构 5 1.2 Eclipse工程文件 5 1.3 Android项目的编译及运行过程 6 2.1 AndroidStudio中R文件的位置 7 2.2 View继承结构图 7 2.3 LinearLayout布局基本属性 7 2.4 用户名密码 登陆重置常用...

    Android实例代码

    2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本界面组件:TextView、EditText; Button、ImageButton; 9Patch; RadioButton、CheckBox; ToggleButton;AnalogClock、...

    Android开发资料合集-World版!

    5.5、LISTVIEW 与 SCROLLVIEW 解决办法 144 方法一:(重写ListView) 144 方法二: 150 5.6、3D魔方 151 6、ANDROID UI 动画 160 6.1、四种2D动画 160 6.1.1、透明度控制动画效果 alpha 160 6.1.2、旋转动画效果 ...

    Android 开发技巧

    5.5、LISTVIEW 与 SCROLLVIEW 解决办法 144 方法一:(重写ListView) 144 方法二: 150 5.6、3D魔方 151 6、ANDROID UI 动画 160 6.1、四种2D动画 160 6.1.1、透明度控制动画效果 alpha 160 6.1.2、旋转动画效果 ...

    android开发使用例子

    表格布局(TableLayout) 数据据存储 系统偏好 文件 网络 数据库 显示网页: 1. Uri uri = Uri.parse("http://www.google.com"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); ...

Global site tag (gtag.js) - Google Analytics