レイアウト全体がスクロールするようにレイアウトを設計する必要があり、レイアウト内に関連するコンテンツをフォームに表示する必要があるGrid
ため、使用することにしましGridView
た。内部では使用しないでください) また、私はこれを行う必要があります。GridView
ScrollView
GridView
ScrollView
11 に答える
固有のスクロール以外にも、GridView には確かに利点があります。たとえば、渡されたデータに基づいて伸縮する、一貫性のある動的なセルのレイアウトです。したがって、そのような機能を望むのは良くないと人々が言うとき、それは間違っていると思います。なぜなら、スクロール ビュー内に画像 (ビュー) の動的なグリッドが必要であり、スクロール ビュー全体にグリッド以外のものを含めることができるからです。細胞。
さて、これを行う方法は次のとおりです。ここで答えを確認してください。これは、プロジェクトにインポート/作成する拡張可能な高さの GridView です。これが基本的に意味することは、GridView に項目が追加されると、高さを設定したままスクロールを使用するのではなく、単に高さを拡大するということです。これはまさにあなたが望むものです。
プロジェクトに ExpandableHeightGridView を配置したら、GridView を配置する XML レイアウトに移動します。次に、次のようなことができます(言い換え):
<ScrollView ...>
<RelativeLayout ...>
<com.example.ExpandableHeightGridView ... />
<other view items />
</RelativeLayout>
</ScrollView>
次に、GridView のアダプターを設定するアクティビティで、展開するように設定する必要があります。そう:
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
この拡張可能な GridView が必要な理由は、標準の GridView が拡張されないという事実が原因でスクロールが発生するためです。特定の高さにくっつき、ビューの境界を超えてアイテムがいっぱいになると、スクロール可能になります。これにより、GridView は常にその高さをコンテンツに合わせて拡張するため、スクロール モードに入ることができなくなります。これにより、ScrollView 内でそれを使用し、ScrollView 内でその上または下にある他のビュー要素を使用して、それらをすべてスクロールさせることができます。
これにより、探している結果が得られるはずです。ご不明な点がございましたら、お知らせください。
ScrollView 内でGridViewに固定サイズを与え、スクロールできるようにする方法を見つけました。これにより、GridView のすべての要素をスクロールしなくても、ScrollView 全体を表示できます。ExpandableHeightGridViewを使用する方が理にかなっています。
そのためには、GridView を拡張する新しいクラスを実装し、onTouchEvent() をオーバーライドしてrequestDisallowInterceptTouchEvent(true)を呼び出す必要があります。したがって、親ビューはグリッド インターセプト タッチ イベントを離れます。
GridViewScrollable.java:
package com.example;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.GridView;
public class GridViewScrollable extends GridView {
public GridViewAdjuntos(Context context) {
super(context);
}
public GridViewAdjuntos(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GridViewAdjuntos(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent ev){
// Called when a child does not want this parent and its ancestors to intercept touch events.
requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
}
}
ScrollView 内で、必要な特性とマージンを使用してレイアウトに追加します。
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="true" >
<com.example.GridViewScrollable
android:id="@+id/myGVS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" />
</ScrollView>
そして、あなたのアクティビティでそれを取得してください:
GridViewScrollable myGridView = (GridViewScrollable) findViewById(R.id.myGVS);
私はそれが役立つことを願っています=)
コトリンでは:
class GridViewScrollable @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : GridView(context, attrs, defStyleAttr) {
override fun onTouchEvent(ev: MotionEvent?): Boolean {
// Called when a child does not want this parent and its ancestors to intercept touch events.
requestDisallowInterceptTouchEvent(true)
return super.onTouchEvent(ev)
}
}
「カスタム ビュー GridViewScrollable は onTouchEvent をオーバーライドしますが、performClick はオーバーライドしません」という厄介な警告があります。必要に応じて、ご自身で解決してください。
dennisdrew's answer を使用していて、グリッドの上にコンテンツがあり、ビューを開いたときに非表示になる場合は、下に最後の行を追加するだけです
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
gridView.setFocusable(false);
ExpandableHeightlistView
またはExpandableHeightGridView
内部で使用することをお勧めしますscrollview
。
論理
非常に大きな高さのヒントを提供して、全体の高さを計算します。ただし、この整数の上位 2 ビットは使用しないでください。これらは MeasureSpec モード用に予約されています。
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
詳細については、デモで以下の例を調べてください