转载请注明出处:

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来做适配器

 package com.and.mine;

 import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout; public class LinearLayoutForListView extends LinearLayout
{
private BaseAdapter adapter;
private OnItemClickListener onItemClickListener; /**
* 通过 Java代码 实例化
* @param context
*/
public LinearLayoutForListView(Context context)
{
super(context);
//设置LinearLayoutForListView为垂直布局,否者默认为水平布局,容易疏忽导致子项显示不全
LinearLayoutForListView.this.setOrientation(LinearLayout.VERTICAL);
} /**
* 此构造函数可以允许我们通过 XML的方式注册 控件
* @param context
* @param attrs
*/
public LinearLayoutForListView(Context context, AttributeSet attrs)
{
super(context, attrs);
LinearLayoutForListView.this.setOrientation(LinearLayout.VERTICAL);
} /**
* 设置适配器
*
* @param adpater
*/
public void setAdapter(BaseAdapter adpater)
{
this.adapter = adpater;
bindLinearLayout();
} /**
* 获取适配器Adapter
*
* @return adapter
*/
public BaseAdapter getAdpater()
{
return adapter;
} /**
* 绑定布局:将每个子项的视图view添加进此线性布局LinearLayout中
*/
public void bindLinearLayout()
{
int count = adapter.getCount();
for (int i = 0; i < count; i++)
{
View v = adapter.getView(i, null, null); if (i != count - 1)
{ //添加每项item之间的分割线
v = addLine(v);
}
addView(v, i);
}
setItemClickListener();
Log.v("countTAG", "" + count);
} /**
* 添加每项item之间的分割线
*
* @param view
* @return
*/
public View addLine(View view)
{
//分割线view
View lineView = new View(view.getContext()); // 将数据从dip(即dp)转换到px,第一参数为数据原单位(此为DIP),第二参数为要转换的数据值
float fPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
(float) 0.5, view.getResources().getDisplayMetrics());
int iPx = Math.round(fPx); LayoutParams layoutParams = new LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, iPx);
lineView.setLayoutParams(layoutParams);
lineView.setBackgroundColor(view.getSolidColor()); LinearLayout ly = new LinearLayout(view.getContext());
ly.setOrientation(LinearLayout.VERTICAL); ly.addView(view);
ly.addView(lineView); return ly;
} /**
* 设置点击子项事件监听对象
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener)
{
this.onItemClickListener = onItemClickListener;
setItemClickListener();
} /**
* 获取点击子项事件监听对象
* @return
*/
public OnItemClickListener getOnItemClickListener()
{
return onItemClickListener;
} /**
* 设置子项点击事件
*/
private void setItemClickListener()
{
if (adapter != null)
{
for (int i = 0; i < LinearLayoutForListView.this.getChildCount(); i++)
{
View view = LinearLayoutForListView.this.getChildAt(i);
if (onItemClickListener != null)
{
//设置子项点击事件
view.setOnClickListener(new ItemClickListener(view, i, adapter.getItemId(i)));
}
}
}
} class ItemClickListener implements OnClickListener
{
View view;
int position;
long id; public ItemClickListener(View view, int position, long id)
{
this.view = view;
this.position = position;
this.id = id;
} @Override
public void onClick(View v)
{
//将子项视图的点击事件转发到整个listview的OnItemClick事件中
//此方法有局限性,第一个参数 AdapterView<?> parent(即当前listView的视图)没传入onItemClick()中
onItemClickListener.onItemClick(null, view, position, id);
}
}
}

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

<?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="wrap_content"
android:orientation="vertical" > <com.and.mine.LinearLayoutForListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.and.mine.LinearLayoutForListView> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用方法" /> </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. 01背包之求第K优解——Bone Collector II

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解 ...

  2. Java---练习:文件切割与合并(1)

    实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...

  3. Java中String的哈希值计算

    下面都是从String类的源码中粘贴出来的 private int hash; // Default to 0 public int hashCode() { int h = hash; if (h ...

  4. E - QS Network - zoj 1586(简单)

    题意:在一个叫做QS的星系,他们使用一些特殊的通讯方式,两个人之间通讯需要使用一个网络适配器,但是一个网络适配器只能跟一个人联系,所有它连接几个人就需要及格适配器,而且每个人都有一些不同的偏好,喜欢的 ...

  5. SWOT分析法

    SWOT(Strengths Weakness Opportunity Threats)分析法,又称为态势分析法或优劣势分析法,用来确定企业自身的竞争优势(strength).竞争劣势(weaknes ...

  6. 二、linux文件系统之linux启动

    Linux组成 kernel  shell  文件系统  application(应用程序) 标准库函数 内核源码位置: /usr/src   /boot/vmlinuz*(内核压缩文件,启动要加载) ...

  7. [Typescript] Introduction to Generics in Typescript

    If Typescript is the first language in which you've encountered generics, the concept can be quite d ...

  8. crtmpserver 基本流程分析

    近期在研究crtmpserver,这里记录下学习过程,首先我们先分析下基本流程. 1.初始化流程 InitNetworking---初始化网络 Initialize Logger::Init()--- ...

  9. TinyXml 快速入门(三)

    在<TinyXml 快速入门(二)>介绍使用tinyxml库获取xml文件声明,查询指定节点.删除指定节点的做法.在本文中继续介绍修改指定节点和增加节点的做法. 修改节点其实和查询指定节点 ...

  10. HashSet与HashMap

    HashSet底层由HashMap实现 Hash表:存放链表表头的数组 HashSet的值存放于HashMap的key上,而HashMap的value统一为PRESENT(private static ...