171

私のアプリの一部では、ユーザーに名前のリストが表示され、必要に応じてグループ化するように求められます。

(注意してください、ListView コードは Android Views チュートリアルからそのままコピーされました。私はまだ自分のニーズに合わせてカスタマイズしていません。これを機能させる方法を見つけようとしているだけです。)

基本的なレイアウトは、RelativeLayout を含む ScrollView (以下のコードでは「groupsScrollView」と呼ばれます) を含む LinearLayout です。いくつかのボタンとテキストがあり、その下に名前のリストを表示する ListView があります。これらはすべて表示可能な画面領域よりも高いため、ユーザーは縦方向にスクロールしてすべてを見ることができます。

これはすべて美しく機能しますが、ページが読み込まれると、常に ListView の上部 (ページの中央) に事前スクロールされます。ユーザーに何をすべきかを伝えるために作成したテキストとボタンが表示されません。

画面をつかんで上にスクロールすることはできますが、それは問題なく機能しますが、画面が既に一番上までスクロールされていることを確認したいと思います。新たにロードされたページの上部を表示するために、ユーザーが上にスクロールする必要はありません。しかし、プログラムで画面の一番上までスクロールしようとしたことはすべて失敗しました。

これが私のonCreateメソッドです:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

「mainScrollView.pageScroll(View.FOCUS_UP);」という行が問題です。エラーは発生しませんが、何もしないようです。scrollTo(0,0)、scrollDirection(View.FOCUS_UP)を試しました)、および私が考えることができる他のすべて。

エラーが発生しないので、これらのスクロール コマンドが実際に機能していると仮定する必要がありますが、それを含む ScrollView または RelativeLayout の上部ではなく、ListView の上部にスクロールしていると想定する必要があります。これは、Google 独自の scrollTo(int x, int y) メソッドの説明で確認されているようです。「このバージョンでは、スクロールも子の境界に固定されます。」

長い質問をさらに長くするために、ScrollView 内に含まれる画面に一連のビューをロードし、ユーザーが操作できるようにプログラム全体をページの上部にスクロールするにはどうすればよいでしょうか?

ありがとう!

4

15 に答える 15

283

試す

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

それはうまくいくはずです。

于 2011-01-23T13:15:46.297 に答える
180

同じ問題がありました。おそらく何らかのバグです。

fullScroll(ScrollView.FOCUS_UP)他の答えから でもうまくいきませんでした。
私にとってうまくいったscroll_view.smoothScrollTo(0,0)のは、ダイアログが表示された直後に電話をかけることだけでした。

于 2012-05-19T20:10:00.270 に答える
100

私は同じ問題を抱えていましたが、これで修正されました。お役に立てば幸いです。

listView.setFocusable(false);
于 2014-07-11T18:12:16.423 に答える
36

これらすべての有効なソリューションの主な問題は、スクロールがまだ画面に描画されていないときにスクロールを上に移動しようとしていることです。

スクロール ビューが画面に表示されるまで待ってから、これらのソリューションのいずれかで上に移動する必要があります。遅延を気にしないため、これは postdelay よりも優れたソリューションです。

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });
于 2013-10-30T08:35:27.473 に答える
25

私は同じ問題に直面しました ビューフリッパーまたはダイアログ内でスクロールビューを使用している場合 scrollViewObject.fullScroll(ScrollView.FOCUS_UP)、そのケースは false を返すため、ケース はうまくいきscrollViewObject.smoothScrollTo(0, 0)ました

スクロール フォーカス トップ

于 2012-12-12T09:56:22.953 に答える
20
 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
于 2014-07-02T06:56:06.397 に答える
9
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
于 2014-02-26T12:46:51.103 に答える