在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示。虽然网上有给出解决方案,但事实上并不好用,并不完美。

public void setListViewHeightBasedOnChildren(ListView listView) {

// 获取ListView对应的Adapter

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter == null) {

return;

}

int totalHeight = 0;

for (int i = 0; i < listAdapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目

View listItem = listAdapter.getView(i, null, listView);

listItem.measure(0, 0); // 计算子项View 的宽高

totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度

}

ViewGroup.LayoutParams params = listView.getLayoutParams();

params.height = totalHeight
    + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

// listView.getDividerHeight()获取子项间分隔符占用的高度

// params.height最后得到整个ListView完整显示需要的高度

listView.setLayoutParams(params);

}

因此,为了彻底解决问题,就需要我们另辟途径了,我们使用 LinearLayout 绑定 Adapter的方法来代替ListView

将 adapter 里面的 view 全部加入 LinearLayout 并设置回调监听,添加DataSetObserver监听adapter 的改变。


public class LinearLayoutForListView extends LinearLayout {
private Adapter mAdapter;
private OnItemClickListener mOnItemClickListener;
private SparseArray<View> mViewHolders;
private AdapterDataSetObserver mDataSetObserver; public OnItemClickListener getOnItemClickListener() {
return mOnItemClickListener;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
} public LinearLayoutForListView(Context context) {
super(context);
} public LinearLayoutForListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public LinearLayoutForListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} public void setAdapter(Adapter adapter) {
this.mAdapter = adapter;
bindLinearLayout();
}
/** 绑定布局 */
private void bindLinearLayout() {
if (mAdapter == null) {
return;
}
setOrientation(LinearLayout.VERTICAL);
int count = mAdapter.getCount();
this.removeAllViews();
mViewHolders = new SparseArray<View>(count);
for (int i = 0; i < count; i++) {
final View v = mAdapter.getView(i, null, null);
final int tmp = i;
final Object obj = mAdapter.getItem(i);
mViewHolders.put(i,v);
// view 点击事件触发时回调我们自己的接口
v.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClicked(v, obj, tmp);
}
}
});
addView(v);
}
} /**
*
* 回调接口
*/
public interface OnItemClickListener {
/**
* @param v 点击的 view
* @param obj 点击的 view 所绑定的对象
* @param position 点击位置的 index
*/
public void onItemClicked(View v, Object obj, int position);
} @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if(mAdapter != null && mDataSetObserver == null){
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
}
} @Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(mAdapter != null && mDataSetObserver != null){
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
} private class AdapterDataSetObserver extends DataSetObserver {
@Override
public void onChanged() {
if(mAdapter!=null){
final int count = mAdapter.getCount();
for (int i = 0; i < count; i++){
mAdapter.getView(i,mViewHolders.get(i,null),null);
}
requestLayout();
}
}
}
}

调用
list.setAdapter(madapter);
list.setOnItemClickListener(new LinearLayoutForListView.OnItemClickListener() {
@Override
public void onItemClicked(View v, Object obj, int position) { }
});

使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突的更多相关文章

  1. 重写ListView解决ListView内部ViewPaper滑动事件冲突问题

    非常easy 重写ListView 其它类似问题解决ScrollView嵌套ViewPager出现的滑动冲突问题 http://blog.csdn.net/zhangyiacm/article/det ...

  2. 伴随ListView、RecyclerView、ScrollView滚动滑入滑出小图标--第三方开源--FloatingActionButton

    FloatingActionButton在github上的项目主页是:https://github.com/makovkastar/FloatingActionButton 它的依赖包NineOldA ...

  3. 解决EditText和ScrollView滑动冲突问题

    该类需要调用 OnTouchListener接口 黄色部分是需要更改部分,改为自己的edittext@Override public boolean onTouch(View view, Motion ...

  4. 解决EditText跟ScrollView滑动冲突

    etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, Motion ...

  5. Android开发 解决EditText与NestedScrollView 滚动冲突问题

    问题简述 在将EditText套进NestedScrollView的情况下,EditText输入了多行内容后,无法触摸滚动到第一行 问题原因 在将EditText套进NestedScrollView的 ...

  6. 简单解决ListView和ScrollView冲突,复杂情况仅供参考

    ScrollView嵌套ListView冲突问题的最优解决方案 (转) 记录学习之用 项目做多了之后,会发现其实 ScrollView嵌套ListVew或者GridView等很常用,但是你也会发现各种 ...

  7. android ScrollView滚动距离和判断滚动停止状态

    今天很高兴,自己解决了判断ScrollView滚动停止的监听,现在分享给大家. 因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROL ...

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

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

  9. Android ListView高度自适应和ScrollView冲突解决

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...

随机推荐

  1. C#中反射type记录

    写代码的时候经常需要使用反射相关的东西例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA  a; 为例1. 通过typeof(ClassA) 或者 a.Get ...

  2. 连通性 保证f具有介值性质

  3. python基础教程_学习笔记11:魔法方法、属性和迭代器

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...

  4. 各种python 函数參数定义和解析

    python 中的函数參数是赋值式的传递的,函数的使用中要注意两个方面:1.函数參数的定义过程,2.函数參数在调用过程中是怎样解析的. 首先说一下在python 中的函数调用过程是分四种方式的.这里且 ...

  5. ajax进度条

    .graph { width: 400px; height: 25px; border: 1px solid #f8b3d0; } .bar { background-color: #ffe7f4; ...

  6. IDA调试android so的.init_array数组

    参考: http://www.itdadao.com/articles/c15a190757p0.html 一. 为什么要调试init_array init_array的用途 1. 一些全局变量的初始 ...

  7. android 内存泄漏问题【转】

    本文转载自:http://www.voidcn.com/article/p-hbnuyfwz-ee.html 内存泄露问题在一些压力测试的场景很容易暴露,例如一些常用应用场景反复操作(eg:反复切换前 ...

  8. deepin 安装微信与QQ

    安装QQ sudo apt-get install deepin.com.qq.im 安装微信 sudo apt-get install deepin.com.wechat 附录 其他安装包 http ...

  9. spring的了解以及简单框架的搭建

    了解spring: Spring是一个开源的控制反转(Inversion of Controller)和面向切面(AOP)的框架,目的是为了简化开发. IOC(控制反转): public class ...

  10. hls协议(最清晰的讲解)

    今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...