`
单眼皮小猪
  • 浏览: 122760 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

解决ScrollView和ListView冲突问题

 
阅读更多
今天项目中需要在ScrollView中嵌套ListView来布局,但是这种布局是Google不提倡的,因为在滚动布局中嵌套一个滚动布局时,会出现外层的滚动布局吃掉内层滚动布局的滚动事件,这样的结果是会出现两种问题:
1、导致内部控件的高度显示不完整,出现只显示部分内容的情况。
2、当内层的ListView内容很多时,外层的ScrollView显示的定位可能不是顶层显示,而是显示底部。
解决办法是参考网上各位大侠的代码而来,本人水平有限,特此记录。

上代码:
布局文件:goodsorder.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/white" >
<ScrollView 
    android:id="@+id/scrollview"
    android:scrollbars="none"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
	<LinearLayout
		android:id="@+id/sixline"
		android:orientation="vertical"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_margin="5dp"
		>
		<TextView
		    android:id="@+id/cardMessagetext"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:textColor="#000000"
		    android:textSize="16sp"
		    android:textStyle="bold"
		    />
		<TextView
		    android:id="@+id/cardMessage"
		    android:textColor="#000000"
		    android:textSize="14sp"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    />
	</LinearLayout>
	<ListView 
		android:id="@+id/goodsList"
		android:fillViewport="true"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		/>
    </LinearLayout>
</ScrollView>
</RelativeLayout>


ListView中Item的布局:goodsOrderList.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"
    >
    <TextView
	    android:id="@+id/title"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:textColor="#000000"
	    android:textSize="14sp"
	    />
    <TextView
	    android:id="@+id/ordersn"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:textColor="#000000"
	    android:textSize="14sp"
	    />
     <TextView
	    android:id="@+id/orderamounttext"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:textColor="#000000"
	    android:textSize="14sp"
	    android:paddingLeft="20dp"
	    />
    <TextView
	    android:id="@+id/orderamount"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:textColor="#000000"
	    android:textSize="14sp"
	    />
</LinearLayout>


最重要的是代码部分了,下面是主要的代码


public class GoodsOrderActivity extends Activity {
    /** Called when the activity is first created. */
	private ListView goodsView; //商品简单信息显示
	private ScrollView scrollView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.goodsorder);
        SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.goodsOrderList,
				  new String[]{"title","ordersn","orderamounttext","orderamount"},
				  new int[]{R.id.title,R.id.ordersn,R.id.orderamounttext,R.id.orderamount});
	goodsView = (ListView)findViewById(R.id.goodsList);
	goodsView.setAdapter(adapter);

	setListViewHeight(goodsView);//设置listview的高度,在设置adapter之后设置高度
	
        scrollView = (ScrollView)findViewById(R.id.scrollview);

        scrollView.post(runnable);//设置scrollView的显示位置
	}
    /**
     * 设置Listview的高度
     */
    public void setListViewHeight(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)); 
        listView.setLayoutParams(params);
    }
    /**
     * 设置scrollview显示位置,解决scrollview嵌套listview页面过长时显示问题
     */
    private Runnable runnable = new Runnable() {   
    	   
        @Override   
        public void run() {   
        	GoodsOrderActivity.this.scrollView.scrollTo(1,1);// 改变滚动条的位置   
        }   
    }; 
/**
*获取listview数据
*/
private List<Map<String, Object>> getData() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		List<Map<String,Object>> cartGoodsList = getCartGoods();
		Map<String, Object> map = new HashMap<String, Object>();
			map.put("orderamounttext", "数量:");
			map.put("ordersn", "价格:");
			map.put("title", "title");
			map.put("orderamount","numberText");
			list.add(map);
		return list; 
}



1、解决显示高度问题思路是:获取ListView中Item每一行的高度,然后算出总高度,最后给ListView设置一下高度,这样系统就知道了ListView的高度。
2、解决显示定位的问题,是设置ScrollView.scrollTo(),但是此方法在onCreate()方法中使用时,必须的另开一个线程,因为此方法,需要在ScrollView中的内容完全加载之后,才会调用,在onCreate()方法没结束之前,ScrollView中的内容是没有完全加载的。
所以需要另开一个线程。

以上观点仅属个人观点,不一定正确,高手莫笑....
0
0
分享到:
评论
1 楼 OracleX 2012-12-10  
定位显示的问题按照你的方法不起作用,请问你用上面的代码能成功实现吗?

相关推荐

    Android解决ScrollView和ListView冲突问题Demo

    本Demo通过自定义ListView,实现了在ScrollView中嵌套ListView而不发生冲突的效果,从而提供了一种有效的解决方案。通过学习和实践这个Demo,开发者可以更深入地理解Android布局组件的交互,并能更好地处理类似的...

    ScrollView+ListView冲突问题完美解决

    综上所述,解决ScrollView和ListView冲突问题需要理解它们的工作原理,并根据实际情况选择合适的方法。通过自定义组件、优化事件处理以及使用更合适的布局组件,我们可以有效地解决这些问题,从而提供更好的用户体验...

    解决scrollView和listview滚动冲突,实现listview滑动到顶端和底部之后还能拖拽一定的距离,松开后返回

    在Android开发中,ScrollView和ListView是两种常用的布局组件,它们分别用于实现可滚动的大视图和展示多行可滚动的数据列表。然而,在实际应用中,当这两种组件同时存在于一个界面时,滚动冲突的问题就会出现,导致...

    解决Scrollview嵌套listview下拉刷新的一些问题

    在Android开发中,ScrollView和ListView是...总的来说,处理ScrollView和ListView的嵌套问题需要对Android布局有深入理解,同时也要关注性能和用户体验。合理的设计和优化能够帮助我们构建出流畅、功能完善的移动应用。

    解决ScrollView嵌套ListView Demo

    通过上述方式,我们可以有效地解决ScrollView嵌套ListView的滚动冲突问题,使得两者能够协同工作,提供良好的用户体验。在"demo"项目中,你可以找到一个实际的应用示例,通过运行和调试,更深入地理解这个解决方案的...

    解决scrollview嵌套listview的冲突问题

    用于解决scrollview组件嵌套listview组件时候 两者之间的冲突问题

    android 解决ScrollView和listView嵌套冲突问题(保证在ScrollView中滑动listView只响应listView的滑动)

    在Android开发中,ScrollView和ListView的嵌套是一个常见的需求,但同时也伴随着许多技术挑战,主要问题在于两者都具有滚动功能,导致冲突,使得用户在滚动时可能会遇到不确定的行为。本篇将详细介绍如何解决这种...

    Android中自定义ListView,解决scrollview嵌套listview 滑动事件冲突

    总之,解决ScrollView与ListView滑动事件冲突的关键在于正确处理触摸事件的分发,确保每个组件都能在合适的时候接收并处理滑动事件。通过自定义组件或者利用现有组件的特性,我们可以构建出更加符合用户体验的界面。...

    解决ScrollView,ListView滚动条冲突

    通过以上的方法,我们可以有效地解决ScrollView和ListView之间的滚动条冲突,提高应用的用户体验。在实际开发中,应根据具体需求灵活运用这些技巧,确保界面的流畅性和交互性。同时,不断学习和掌握Android UI设计的...

    ScrollView和ListView和GridView冲突解决

    本篇文章将深入探讨如何解决ScrollView与ListView、GridView之间的冲突问题。 首先,ScrollView是一个可以包含单个直接子视图的布局,它允许用户滚动内容,当内容超过屏幕大小时尤其有用。然而,ScrollView不支持...

    ScrollView与ListView的滑动冲突

    通过上述介绍,我们可以看出解决ScrollView与ListView/GridView之间的滑动冲突问题主要涉及到两种方法:一是通过编程方式手动设置ListView/GridView的高度;二是使用支持嵌套滑动的`NestedScrollView`。这两种方法各...

    scrollview嵌套listview冲突解决

    在实际开发中,应尽量避免ScrollView嵌套ListView,因为这可能导致性能问题和用户体验不佳。若确实需要这种布局,可以尝试上述方法进行优化。在给定的压缩包文件"**MyApplicationcll**"中,可能包含了示例代码或资源...

    ScrollView_ListView 事件冲突

    ScrollView_ListView 事件冲突

    ScrollView嵌套ListVIew两者之间滑动问题

    总之,处理ScrollView与ListView之间的滑动冲突是Android开发中的常见挑战,理解滑动事件的处理流程和利用提供的API或自定义逻辑,是解决问题的关键。通过以上所述的方法,开发者能够有效地解决这种冲突,实现流畅的...

    解决ScrollView嵌套ListView问题的几种方案

    然而,当在一个ScrollView中嵌套一个ListView时,会遇到一系列的问题,主要是由于两者都具有滚动功能,导致冲突,用户体验受到影响。本文将探讨几种解决这种问题的方案。 ### 方案一:使用NestedScrollView替代...

    ScrollView嵌套ListView滑动冲突的解决方法

    只需将原始的ScrollView替换为NestedScrollView,通常就能解决问题。 4. **使用ViewGroups嵌套** 另一种解决方案是将ListView放入另一个布局(如LinearLayout或RelativeLayout),然后再将这个布局添加到...

    四种方法解决ScrollView嵌套Listview

    在Android开发中,ScrollView和ListView的嵌套是一个常见的需求,但也是一个挑战,因为它们都是滚动视图,直接组合可能导致冲突和不可预期的行为。本篇文章将详细介绍四种解决ScrollView嵌套ListView问题的方法,...

    ScrollView嵌套ListView刷新

    总的来说,解决ScrollView嵌套ListView刷新问题的关键在于合理选择和使用适合的组件,以及对滑动事件的精细控制。在实际开发中,应尽量避免不必要的嵌套,优先考虑使用NestedScrollView或RecyclerView等更现代的组件...

    ScrollView和ListView和GridView冲突解决之自定义ListView和GridView

    本文将深入探讨如何解决ScrollView与ListView、GridView之间的冲突,并介绍自定义ListView和GridView的方法。 首先,ScrollView是一个可以包含多个子视图并允许用户滚动查看的容器。它适用于显示少量内容且需要全屏...

    android中scrollview与listview共存

    这将是一个很好的实践案例,帮助你理解和解决实际开发中的相关问题。 总结来说,处理ScrollView和ListView共存的关键在于理解它们各自的特性和需求,合理设计布局,以及利用Android提供的API来协调滚动行为。通过...

Global site tag (gtag.js) - Google Analytics