2016-06-23 12 views
0

私はScrollViewとListViewを内部に持つWMLアプリケーションを持っています。 ListViewの項目の高さは可変です。ScrollViewのリストビュー:スクロール位置を知る方法(下部にありますか)

実際にはスクロールバーが移動したときと、スクロールバーが移動していないときとを知る必要があります。私の目標は、スクロールが下部にある場合にのみListViewにアイテムを追加するときに、スクロールを下部に維持することです(positionViewAtEnd())。一番下にない場合、positionViewAtEnd()は使用されません。

私は高さで "再生"しようとしました、contentHeigh & contentYです。場合によっては(スクロールが下部:contentHeight == contentY + height)、それ以外の時間contentY値が負の値に変わり、コードが失敗します...

助けが必要ですか?私はスクロールが下にか

であるかどうかを検出するために、いくつかのプロパティの変更で 'atYEnd' で試してみました

どうもありがとう

サンディエゴ


おかげJPヌルミ、

これはうまくいくように見えますが、それを 'onCountChanged'で使用して、スクロールを最下部に置く(またはしない)ようにします

ListViewの高さはすべてメッセージでいっぱいですが、受信メッセージが ListViewの高さ(1番目のcontentYが '0'ではない)を満たしている場合は、1つの場合ではなく機能します。

それがクリアされている場合、私は知らない...

私は(代理人を含む)をテストするために私のコードを簡素化しており、今ではそのように思える

FocusScope { 
     clip: true 

     id: focusScopeView 

     width: parent.width; height: parent.height 

     ScrollView { 

      width: parent.width; height: parent.height 

      ListView { 
       id: listTexts 

       width: parent.width; height: parent.height 

       property bool bScrolled: false 

       model: textsModel 
       delegate: Text { text: "Contact:\t" + eventText } 

       onCountChanged: { 

        if (!bScrolled) 
         positionViewAtEnd(); 
     } 

       onContentYChanged: { 
        bScrolled = !atYEnd; 

        if (atYEnd) 
         positionViewAtEnd() 
     } 

       onContentHeightChanged: { 
        if (!bScrolled) 
         positionViewAtEnd(); 
      } 
      } 
     } 
    } 

おかげに関して!

サンディエゴ

答えて

0

は、計算が失敗した理由は、ListViewは、高さが可変の代表団のためにその起源を調整しなければならなかったということです。計算にoriginYを含めることで正しい値を得ることができますが、FlickableatYEndであるかどうかを確認する便利な方法があります。

編集:これはややこしいことですが、自動スクロール(またはスクロールの必要性を避けるため)を行う別の方法は、ListView.BottomToTopvertical layout directionとして使用することです。次に、末尾に追加する場合は、モデルの先頭に新しいメッセージを挿入します。この方法では、新しいメッセージが到着したときに、コンテンツを手動で配置せずに下部に揃えたままにします。しかし、少しキャッチがあります。ビューに収まるコンテンツよりもコンテンツが少ない場合は、コンテンツも下部に揃えられます。おかげで、しかし、新しい着信メッセージが一番下に追加する必要があります

+0

... – Diego

+0

ははい、それは何 'verticalLayoutDirectionです:あなたは、モデルの初めに挿入したときListView.BottomToTop'は'例えば、ありませんlistModel.insert (0、{テキスト: "foo"}) ' – jpnurmi

0
ListView { 
     onContentYChanged: { 
      if (contentY === contentHeight - height) { 
       console.log("scrolled to bottom"); 
      } 
     } 
    } 


    ScrollView { 
      flickableItem.onContentYChanged: { 
       if (flickableItem.contentY === flickableItem.contentHeight - viewport.height) { 
        console.log("scrolled to bottom"); 
       } 
      } 
     } 
+0

あなたのコードを少し説明してください – moritzg

関連する問題