ui在线设计网站,安徽网站建设外贸,镇江制作网页图片,网站推广公司兴田德润官网多少在项目中#xff0c;我们常常会遇到一个ScrollView里面会嵌套ListView的情况#xff0c;但往往你会发现#xff0c;ListView和ScrollView的滚动时间会有冲突问题#xff0c;造成ListView不能完全显示。虽然网上有给出解决方案#xff0c;但事实上并不好用#xff0c;并不…在项目中我们常常会遇到一个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 SparseArrayView 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 SparseArrayView(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) { }});转载于:https://www.cnblogs.com/lucktian/p/6478227.html