转载请注明出处:

http://www.goteny.com/articles/2013/11/8.html

http://www.cnblogs.com/zjjne/p/3428480.html

当同一个页面布局中的ScrollView中包含有ListView时,两个布局由于都有滑动而导致冲突,最明显的特征就是当ListView中有多个子项时,会出现显示不全的情况,只会显示一两个子项。

以前查到一个简单的解决办法setListViewHeightBasedOnChildren(ListView listView)的那个办法,是测出ListView中每一个子项视图的高度,然后再相加起来,以这个值来设定整个ListView的高度。这种方法的优点是比较简单,能解决子项视图布局比较简单且文字较少的情况;但不足之处是每次刷新ListView时都要调用这个函数来重新设定ListView的高度,重点是:若子项视图中文字过多,出现文字自动换行的时候,此时测出来的高度就不准确了,难以做到准确设置ListView的高度。

这次要介绍的方法虽说有点麻烦,但是相对来说比较治本的方法,其思想是继承并扩展线性布局LinearLayout,用LinearLayout替代ListView来实现ListView的功能和效果。

下面是效果示例:

这是修改前的冲突情况(ListView显示只能显示第一行)

这是修改后的效果

本文的实现思想和代码是在

Android 解决ListView ScrollView 共存冲突的问题http://terryblog.blog.51cto.com/1764499/373509

这篇文章的基础上作了少许修改和“添加子项间分隔线、子项点击事件监听”而成的。

主要思想是:

给LinearLayout添加BaseAdapter、OnItemClickListener成员,

然后在绑定布局时调用BaseAdapter的getView方法取得子项的视图View,

将此View用addView方法添加进LinearLayout中;

并设置每一个子项视图View的监听点击事件OnClickListener,

在OnClickListener的onClick方法中调用OnItemClickListener的

onItemClick方法,即在将子项的点击事件转发到LinearLayout的onItemClick事件中。

下面是用来替代ListViewLinearLayout代码,此LinearLayoutForListView作为自定义控件来替代ListView

用法和ListView的用法一样,使用BaseAdapter来做适配器

  1. package com.and.mine;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.util.TypedValue;
  7. import android.view.View;
  8. import android.widget.AdapterView.OnItemClickListener;
  9. import android.widget.BaseAdapter;
  10. import android.widget.LinearLayout;
  11.  
  12. public class LinearLayoutForListView extends LinearLayout
  13. {
  14. private BaseAdapter adapter;
  15. private OnItemClickListener onItemClickListener;
  16.  
  17. /**
  18. * 通过 Java代码 实例化
  19. * @param context
  20. */
  21. public LinearLayoutForListView(Context context)
  22. {
  23. super(context);
  24. //设置LinearLayoutForListView为垂直布局,否者默认为水平布局,容易疏忽导致子项显示不全
  25. LinearLayoutForListView.this.setOrientation(LinearLayout.VERTICAL);
  26. }
  27.  
  28. /**
  29. * 此构造函数可以允许我们通过 XML的方式注册 控件
  30. * @param context
  31. * @param attrs
  32. */
  33. public LinearLayoutForListView(Context context, AttributeSet attrs)
  34. {
  35. super(context, attrs);
  36. LinearLayoutForListView.this.setOrientation(LinearLayout.VERTICAL);
  37. }
  38.  
  39. /**
  40. * 设置适配器
  41. *
  42. * @param adpater
  43. */
  44. public void setAdapter(BaseAdapter adpater)
  45. {
  46. this.adapter = adpater;
  47. bindLinearLayout();
  48. }
  49.  
  50. /**
  51. * 获取适配器Adapter
  52. *
  53. * @return adapter
  54. */
  55. public BaseAdapter getAdpater()
  56. {
  57. return adapter;
  58. }
  59.  
  60. /**
  61. * 绑定布局:将每个子项的视图view添加进此线性布局LinearLayout中
  62. */
  63. public void bindLinearLayout()
  64. {
  65. int count = adapter.getCount();
  66. for (int i = 0; i < count; i++)
  67. {
  68. View v = adapter.getView(i, null, null);
  69.  
  70. if (i != count - 1)
  71. { //添加每项item之间的分割线
  72. v = addLine(v);
  73. }
  74. addView(v, i);
  75. }
  76. setItemClickListener();
  77. Log.v("countTAG", "" + count);
  78. }
  79.  
  80. /**
  81. * 添加每项item之间的分割线
  82. *
  83. * @param view
  84. * @return
  85. */
  86. public View addLine(View view)
  87. {
  88. //分割线view
  89. View lineView = new View(view.getContext());
  90.  
  91. // 将数据从dip(即dp)转换到px,第一参数为数据原单位(此为DIP),第二参数为要转换的数据值
  92. float fPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
  93. (float) 0.5, view.getResources().getDisplayMetrics());
  94. int iPx = Math.round(fPx);
  95.  
  96. LayoutParams layoutParams = new LayoutParams(
  97. LinearLayout.LayoutParams.MATCH_PARENT, iPx);
  98. lineView.setLayoutParams(layoutParams);
  99. lineView.setBackgroundColor(view.getSolidColor());
  100.  
  101. LinearLayout ly = new LinearLayout(view.getContext());
  102. ly.setOrientation(LinearLayout.VERTICAL);
  103.  
  104. ly.addView(view);
  105. ly.addView(lineView);
  106.  
  107. return ly;
  108. }
  109.  
  110. /**
  111. * 设置点击子项事件监听对象
  112. * @param onItemClickListener
  113. */
  114. public void setOnItemClickListener(OnItemClickListener onItemClickListener)
  115. {
  116. this.onItemClickListener = onItemClickListener;
  117. setItemClickListener();
  118. }
  119.  
  120. /**
  121. * 获取点击子项事件监听对象
  122. * @return
  123. */
  124. public OnItemClickListener getOnItemClickListener()
  125. {
  126. return onItemClickListener;
  127. }
  128.  
  129. /**
  130. * 设置子项点击事件
  131. */
  132. private void setItemClickListener()
  133. {
  134. if (adapter != null)
  135. {
  136. for (int i = 0; i < LinearLayoutForListView.this.getChildCount(); i++)
  137. {
  138. View view = LinearLayoutForListView.this.getChildAt(i);
  139. if (onItemClickListener != null)
  140. {
  141. //设置子项点击事件
  142. view.setOnClickListener(new ItemClickListener(view, i, adapter.getItemId(i)));
  143. }
  144. }
  145. }
  146. }
  147.  
  148. class ItemClickListener implements OnClickListener
  149. {
  150. View view;
  151. int position;
  152. long id;
  153.  
  154. public ItemClickListener(View view, int position, long id)
  155. {
  156. this.view = view;
  157. this.position = position;
  158. this.id = id;
  159. }
  160.  
  161. @Override
  162. public void onClick(View v)
  163. {
  164. //将子项视图的点击事件转发到整个listview的OnItemClick事件中
  165. //此方法有局限性,第一个参数 AdapterView<?> parent(即当前listView的视图)没传入onItemClick()中
  166. onItemClickListener.onItemClick(null, view, position, id);
  167. }
  168. }
  169. }

XML中使用自定义控件来调用LinearLayoutForListView

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6.  
  7. <com.and.mine.LinearLayoutForListView
  8. android:id="@+id/list"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content" >
  11. </com.and.mine.LinearLayoutForListView>
  12.  
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="使用方法" />
  17.  
  18. </LinearLayout>

当然这种这种方法也是存在不足之处的,欢迎各位指正

转载请注明出处:

http://www.goteny.com/articles/2013/11/8.html

http://www.cnblogs.com/zjjne/p/3428480.html

THE END


解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一的更多相关文章

  1. Android实践之ScrollView中滑动冲突处理

    转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ...

  2. Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

    本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...

  3. 解决水平ListView在ScrollView中出现的滑动冲突

      解决的问题有两个:  1)实现水平滑动的ListView.重写AdapterView,上代码: package com.liucanwen.horizontallistview.view; imp ...

  4. [置顶] android ListView包含Checkbox滑动时状态改变

    题外话: 在xamarin android的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当时我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你想解决掉这个小小的坎 ...

  5. Android ListView分页加载时图片显示问题

    场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...

  6. 【android studio】解决android studio drawable新建项目时只有一个drawable目录的问题

    概述 android studio默认新建Module时,只新建一个drawable目录,并不会新建适配不同分辨率的drawable目录.但其实,这是可以设置的.有以下两种方法: 方法1 详细步骤 进 ...

  7. Android ListView下拉刷新时卡的问题解决小技巧

    问题:ListView下拉刷新时看上去非常的卡 解决方案: 在BaseAdapter的getView方法中,有三个参数 public View getView(int position, View c ...

  8. 解决ListView和ScrollView同时使用时滑动的冲突问题

    ScrollView外面包裹了一个ListView,解决其滑动冲突问题: 只需自定义ListView,命名MyListView: public class MyListView extends Lis ...

  9. Android ListView 和 ScrollView 冲突问题

    近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控 ...

随机推荐

  1. SpringMVC 自定义拦截资料

    1.springmvc学习笔记(28)——自定义拦截器 2.Spring MVC HandlerInterceptor Annotation Example with WebMvcConfigurer ...

  2. 机房管理系统——vb与excel链接2

    因为我之前找的文档让我以为在创建表里面走了非常大的误区,所以当时我直接就在学生管理系统的目录里建了张表,执行时候直接打开这样表即可了. 可是这里面还是存在着非常大的误区. 后来我看了周坤的博客感觉他比 ...

  3. [AngularJS] Design Pattern: Simple Mediator

    We're going to use rootScope emit here to send out events and then we're going to listen for them in ...

  4. [转] gdb的基本工作原理

    转自: http://www.spongeliu.com/linux/howgdbwork/ 还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”.“那好,给我解释下gdb ...

  5. Java基础知识强化76:正则表达式之替换功能

    1. 替换功能: String类的replaceAll方法,如下: public String replaceAll(String regex, String replacement): 使用给定的r ...

  6. Android(java)学习笔记253:ContentProvider使用之内容观察者02

    下面通过3个应用程序之间的交互说明一下内容观察者: 一. 如下3个应用程序为相互交互的: 二.交互逻辑图: 三.具体代码: 1.   16_数据库工程: (1)数据库帮助类BankDBOpenHelp ...

  7. Creating Lists and Cards 创建列表和卡片

    To create complex lists and cards with material design styles in your apps, you can use the Recycler ...

  8. 洛谷 P1412 经营与开发

    /* 粘一下开始写的暴力吧 虽然没啥价值 */ #include<iostream> #include<cstdio> #include<cstring> #inc ...

  9. android-Activity的执行流程

    概述 The following diagram shows the important state paths of an Activity. The square rectangles repre ...

  10. SQL 2008R2 日期转换

    --SQL CONVERT日期转换 print GETDATE() --相同 Select CONVERT(varchar(100), GETDATE(), 0) AS NDateTime --: 0 ...