滑动冲突说实在的就是子view的滑动事件与父view的滑动事件的监听都在同时触发,而导致的activity的点击事件或者布局出问题
常见的就有Scrollerview与Scrollerview与listview或者gridview发生冲突,listview是RecycleView等等的代表。话说,其中listview和scrollerview冲突的时候发生的问题比较奇葩
其中,listview只能显示一条数据我就震惊了,多方查询后才发现是冲突问题。(还是那句作为初学者,积少成多,提高解决问题速度,提高 效率)
Scrollerview与listview发生滑动冲突的解决方法有2种,
(1)新建一个listview类继承listview,并重新它的onMeasure方法
package com.tfot.hotel.yichengyiyu.Activity.zhou_activity.view; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class SouSuoLiShiListView extends ListView { private LayoutInflater inflater; private TextView sousuolishi; private ImageView sousuo_shanchuyitiao_iv; public SouSuoLiShiListView(Context context) { super(context); } public SouSuoLiShiListView(Context context, AttributeSet attrs) { super(context, attrs); } public SouSuoLiShiListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
(2)计算高度等等
/** * 重新计算ListView的高度,解决ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起冲突的问题 * @param listView */ public void setListViewHeight(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; 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.setLayoutParams(params); }
使用
// 创建adapter适配器对象 adapter =new SouSuoListAdapter(this,sousuo,mListener); // 设置适配器 acticity_sousuoye_lv.setAdapter(adapter); setListViewHeight(acticity_sousuoye_lv); acticity_sousuoye_lv.setOnItemClickListener(this); adapter.notifyDataSetChanged();
Scrollerview与gridview发生冲突的解决方法也是重写方法
package com.tfot.hotel.yichengyiyu.Activity.zhou_activity.view; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO 自动生成的构造函数存根 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO 自动生成的方法存根 int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }