60

内部にパーソナライズされた GridView とその他のビューのヒントがある ScrollView に問題があります。最初にアクティビティを開始すると、ScrollView は先頭から開始されますが、別のときにアクティビティにアクセスすると、ScrollView は最初から開始されます。このリンクにあるクラス ExpandableHeightGridView を GridView に使用しました。アクティビティ レイアウトの xml コードは次のとおりです。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewLuogo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="150dp"
            android:layout_height="100dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:adjustViewBounds="true"
            android:maxHeight="200dp"
            android:maxWidth="200dp"
            android:scaleType="fitXY"
            android:src="@android:drawable/ic_menu_gallery" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/nomeTVActivityLuogo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textSize="17sp"
                android:textColor="#005788" />

            <TextView
                android:id="@+id/indirizzoTVActivityLuogo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout2"
        android:layout_marginTop="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageViewMappaLuogo"
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="14dp"
            android:layout_marginTop="5dp"
            android:scaleType="fitXY"
            android:src="@drawable/sfondo_mappa" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="14dp"
            android:text="Immagini"
            android:textColor="#97d6f9" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="14dp"
            android:layout_marginTop="5dp"
            android:background="#97d6f9" />

        <com.example.mappine.ExpandableHeightGridView
            android:id="@+id/gridViewLuogo"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:numColumns="3" >
        </com.example.mappine.ExpandableHeightGridView>

    </LinearLayout>

</RelativeLayout>

コードを使用してみましたscrollView.fullScroll(ScrollView.FOCUS_UP);が、うまくいきませんでした。それでもscrollView.scrollTo(0, 0);成功しませんでした。機能した唯一のコードは次のとおりです。

    scrollView.post(new Runnable() 
      { 
         public void run() { 
             scrollViewLuogo.fullScroll(ScrollView.FOCUS_UP); 
         } 
      });

しかし、それは GridView の上部から画面の上部への高速アニメーションを作成し、私はそれが好きではありません。

なにか提案を??

4

12 に答える 12

182

解決:

返信が遅れた場合は申し訳ありませんが、同じ問題に遭遇し (代わりに ListView を使用していたことのみ)、少し試行錯誤してこれに対する解決策を見つけました:

基本的に問題は、レイアウトがレンダリングされた後に発生するExpandableHeightGridViewでコンテンツを「ハック」してサイズ変更すると、GridView/ListView の子が親フォーカス (ScrollView) を自動的に要求するため、スクロールしようとするとそのアニメーションが表示されるという事実にあります。 scrollTo() でアップします (レイアウトが作成された後に発生し、gridView がサイズ変更された後に発生するため、一般的なコールバックはこれをプログラムで処理するのに役に立ちません)。

したがって、私が見つけた最も簡単な解決策は、ListView/GridView のフォーカス可能なプロパティを次のように無効にすることでした。

listView.setFocusable(false);

そうすれば、最初にアクティビティに入ると、フォーカスがデフォルトになり、Listview/GridView に依存しなくなります。

そして、すべて正常に動作しています=)

于 2014-01-20T13:14:20.900 に答える
22

最も簡単な方法は、親の ScrollView に次の xml 属性を追加することです。

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

つまり、アクティビティを起動したときに、内部コンテナーではなく ScrollView 全体がフォーカスされることになります。これは、たとえば、レイアウト内に編集テキストがあり、画面に入ったときにすぐにフォーカスを取得してキーボードをポップアップさせたくない場合にも役立ちます (同じ原理です)。

したがって、レイアウト上の ScrollView は次のようになります。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewLuogo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    android:background="#fff" >
于 2015-09-30T09:31:21.980 に答える
5

プログラムで上/下にスクロールしたい場合は、これを行うことができます(ここからです):

下にフォーカスする場合:

((ScrollView) findViewById(R.id.scrollView)).post(new Runnable() { 
    public void run() { 
        ((ScrollView) findViewById(R.id.scrollView)).fullScroll(View.FOCUS_DOWN); 
    } 
});

トップにフォーカス

((ScrollView) findViewById(R.id.scrollView)).post(new Runnable() { 
    public void run() { 
        ((ScrollView) findViewById(R.id.scrollView)).fullScroll(View.FOCUS_UP); 
    } 
});
于 2014-11-22T08:44:14.490 に答える
4

ScrollView

android:fitsSystemWindows="false"
于 2016-12-28T19:08:53.187 に答える
2

悲しいことに、あなたが従った例は非常に貧弱です。ListViews と GridViews を ScrollViews に配置しないでください。

ScrollView の目的は、子ビューに無限の高さを与えることです。List/GridView の目的は、潜在的に非常に大きなデータ セットを取得し、一度に使用できるスペースを埋めるのに十分な項目ビューのみを生成して効率化することです。どちらも、他方なしでコンテンツをスクロールできます。

List/GridView を ScrollView に配置することは、「止められない力、不動のオブジェクトに出会う」と言っています。List/GridView のポイントを無効にしたか、それらを組み合わせて ScrollView のポイントを無効にしました。

同じスクロール領域内に他のコンテンツを含めるより良い方法には、ListView でヘッダー/フッター ビューを使用するか、リスト アダプターのコンテンツを 1 つのアダプターに連結する方法があります。アダプターのコンテンツの一部のグリッドを形成するために、行ごとに複数のアイテムを含む ListView アイテムを作成するのは簡単です。

于 2013-06-02T19:50:28.840 に答える
0

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);

私はそれが役立つことを願っています=)

于 2014-11-11T15:41:59.230 に答える
0

フォローアップとして、私も私の痛みを共有します。私のアプリでは、RecyclerView内側にNestedScrollView内側がありCoordinatorLayoutます:

<CoordinatorLayout>
  <NestedScrollView id="@+id/content">

     .......

     <TextView android:id="@+id/header"/>

     <RecyclerView android:id="@+id/recyclerView"/>       

  </NestedScrollView>
</CoordinatorLayout>

もちろん、アクティビティを開くと、ページがスクロールして、真ん中に recyclerView が含まれるようになりました。上記の答えはどれもうまくいかなかったので、次の解決策を思いつきました:

@Override
protected void onCreate( Bundle savedInstanceState ) {
  ....
  content.setOnScrollChangeListener( new NestedScrollView.OnScrollChangeListener() {
    @Override
    public void onScrollChange( NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY ) {
      Rect scrollBounds = new Rect();
      v.getHitRect( scrollBounds );
      if( header.getLocalVisibleRect( scrollBounds ) ){
        if( View.VISIBLE != recyclerView.getVisibility() ){
          recyclerView.setVisibility( View.VISIBLE );
          fillRecyclerViewSomehow();
        }
      }
    }
  }
}

@Override
protected void onResume() {
  ...
  recyclerView.setVisibility( View.GONE ); // this effectively suppresses the focusability
}

HTH

于 2016-04-19T09:30:03.220 に答える