首页 > 代码库 > Scrollerview与listview或者gridview发生冲突

Scrollerview与listview或者gridview发生冲突

滑动冲突说实在的就是子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);   
    }
}

 

Scrollerview与listview或者gridview发生冲突