Tips_AndroidにおけるScrollViewネストListviewまたはGridview(ZZ)

2899 ワード

Androidの基準では、ScrollViewではスライド特性を持つViewをネストすることはできませんが、デザインが本当に必要な場合や、外観をより簡単に実現するために(例えば、外在的な大レイアウトではスライド特性が必要で、内部にリストのようなUI構造がある場合は、ListView+Adpaterの方式で内側の効果を実現するのが便利で、近道を違反する方式でしょう)、時にはこのような奇妙な組み合わせを採用せざるを得ない.
まず、この方法では、特別な処理をしないと発生する衝突と問題について説明します.
1,SrollViewにListViewをネストすると,ListViewの表示に問題があり,1行のみの表示や予想と異なる表示効果が得られるのはandroidがこのような使用を禁止しているためであり,ScrollViewに入れたListViewの高さは計測できないからである.
2,ネストされたサブListViewとGridvIewはスライドできません.サブコントロールのスライドイベントは外のScrollViewに食べられるので、サブコントロールをスライドさせるには、スライドに関するイベントを強制的に切り取るしかありません.
本題に戻り、ネストされたソリューション:
1、第一の方案は、私が比較的に推薦した方案で、ListViewとGridViewを書き換えて、スライド特性を失わせることです.
package com.perfect.xiaoao.all.ui;

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

/**
* Created by IntelliJ IDEA.
* User: zhUser
* Date: 13-1-24
* Time:   6:53
*/
public class NoScrollGridView extends GridView{

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

     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
          int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
          super.onMeasure(widthMeasureSpec, mExpandSpec);
     }
}

package com.perfect.xiaoao.all.ui;

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

/**
* Created by IntelliJ IDEA.
* User: zhUser
* Date: 13-1-24
* Time:   6:53
*/
public class NoScrollListView extends ListView{

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

     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
          int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
          super.onMeasure(widthMeasureSpec, mExpandSpec);
     }
}

上のmakeMeasureSpecメソッド:
1つのMeasureSpecは、親レイアウトがサブレイアウトに渡されるレイアウト要件をカプセル化し、各MeasureSpecは幅と高さの要件のセットを表します.1つのMeasureSpecはサイズとモードからなる.それは3つのモードがあります:UNSPECIFIED(指定されていません)、親要素部隊は要素からいかなる束縛を加えて、サブ要素は任意の所望の大きさを得ることができます;EXACTLY(完全)は、親要素が要素の正確な大きさを決定し、子要素は所定の境界に限定され、それ自体の大きさを無視する.AT_MOST(最大)、サブエレメントは指定したサイズの値に達します.
 
よく使われる3つの関数:
  1.static int getMode(int measureSpec):指定した測定値(フォーマット)に基づいてモードを抽出します(上記3つのモードのいずれか).
  2.static int getSize(int measureSpec):指定した測定値(フォーマット)に基づいてサイズ値を抽出します(このサイズは、一般的に言われているサイズです).
  3.static int makeMeasureSpec(int size,int mode):指定したサイズ値とモードに基づいて測定値(フォーマット)を作成します.
このクラスの使用は、通常viewコンポーネントのonMeasureメソッドで呼び出されます.
使ってみましょうmeasureItem(View child)
まず私たちがよく使う有用な関数ですresolveSize(int size,int measureSpec)
9023         public static int makeMeasureSpec(int size, int mode) {
9024             return size + mode;
9025         }

具体的にはAndroidソースを見てみましょう.
ScrollViewにGridView,Listviewをネストする方法
MeasureSpecの紹介と使用の詳細