1. 程式人生 > >ScrollView 與 ListView 以及 GridView 滑動衝突完美解決

ScrollView 與 ListView 以及 GridView 滑動衝突完美解決

  我們在用ScrollView巢狀ListView或者GridView的時候會遇到兩個問題,一個問題是ListView高度不正常,另外一個問題是ListView無法滑動。因為這幾個控制元件太常用了。我們來看看應該怎麼解決呢?在解決這個問題之前,我們先來解決一個小問題,就是在我專案中使用了ListView來填充資料之後,ListView直接跳轉到了底部,這裡記錄一下解決方法:

ScrollView 巢狀listview時,當listview自動載入時,會自動滑動到scrollview到底部:
解決方法:在listView的父層加上 android:descendantFocusability=”blocksDescendants”;即可,每次載入都會在scrollview頂部

  至於ListView高度的設定,我在前面的一篇博文中已經講過了,這裡就不在重複,沒看過的童鞋這裡給出連結:解決ListView顯示不全、滑動衝突問題

  下面我們來看看如果是ListView在ScrollView中時的處理:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 * 可滾動的ListView,這裡是因為這個ListView被包裹在一個ScrollView中才需要設定縱向拉伸
 */

public class ScrollListView
extends ListView {
public ScrollListView(Context context) { super(context); } public ScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int
height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, height); } }

  下面我們來看看如果是GridView在ScrollView中時的處理:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

/**
 * 重寫網格View,設定高度
 * 可滾動的GridView,這裡是因為這個GridView被包裹在一個ScrollView中才需要設定縱向拉伸
 */

public class ScrollGridView extends GridView {
    public ScrollGridView(Context context) {
        super(context);
    }

    public ScrollGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, height);
    }
}

  ScrollView巢狀ListView時,一般我們有兩種需求:

  第一種是ListVIew完全伸展並跟隨ScrollView一起滑動,那隻要按照上面的解決了伸展的問題, 就實現這種效果了,因為ScrollView預設是攔截ListView的滑動事件的。

  第二種是ScrollView不攔截滑動事件,當我們在ListView區域滑動時,由ListView處理滑動事件,只有在ListView已到達頂部還繼續向上滑或者ListView已到達底部還繼續向下滑時才重新攔截滑動事件。而當我們在非ListView區域滑動時,則直接由ScrollView處理滑動事件,那麼我們看看怎麼實現這種效果。這個問題點選下面連結檢視
https://blog.csdn.net/u010261933/article/details/54409361

歡迎start,歡迎評論,歡迎指正