2016-08-04 41 views
1

Ich habe mehr horizontale Listenansicht. Nehmen wir zum Beispiel zwei davon. Die Einträge in jeder Liste haben nicht die gleiche Länge, wenn eine Liste gescrollt wird - auch die andere. Ich habe das mit der Eigenschaft contentX gelöst. Aber wenn ich zwischen den anderen navigieren möchte (wenn ich die Taste "runter" drücke, muss ich den zweiten Listenblick erzwingen). Das Problem ist, dass der Fokus auf horizontalna2.currentIndex liegt, der erinnert wird, und ich möchte auf das erste sichtbare Element in der Listenansicht gehen.Horizontale Listenansicht Navigation - sichtbarer Artikel

In Android ist, dass es sehr einfach, aber das hier zu lösen, nicht wahr .. ist hier Skizze des Codes:

Rectangle { 
width: 500 
height: 200 
ListModel { 
     id: model1 
     ListElement { itemwidth: 100 } 
     ListElement { itemwidth: 200 } 
     ListElement { itemwidth: 50 } 
     ListElement { itemwidth: 70 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
    } 
    ListModel { 
     id: model2 
     ListElement { itemwidth: 300 } 
     ListElement { itemwidth: 50 } 
     ListElement { itemwidth: 70 } 
     ListElement { itemwidth: 100 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 30 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
     ListElement { itemwidth: 90 } 
    } 

ListView { 
    clip: true 
    id: horizontalna 
    boundsBehavior: Flickable.StopAtBounds 
    width: 500 
    height: 60; 
    focus: true 
    model: model1 
    orientation: ListView.Horizontal 
    KeyNavigation.down: horizontalna2 
    onContentXChanged: { 
     if (horizontalna.activeFocus === true) 
     { 
      horizontalna2.contentX = horizontalna.contentX 
     } 
    } 

    delegate: Item { 
     id: containerHorizontal 
     width: itemwidth; height: 60; 

     Rectangle { 
      id: contentHorizontal 
      anchors.centerIn: parent; width: containerHorizontal.width; height: containerHorizontal.height - 10 
      color: "transparent" 
      antialiasing: true 

      Rectangle { id: insideConHorizontal; anchors.fill: parent; anchors.margins: 3; color: "grey"; antialiasing: true; radius: 5 


       Text { 
        id: labelHorizontal 
        text: "name" 
        color: "white" 
       } 
      } 
     } 
     states: State { 
      name: "active"; when: containerHorizontal.activeFocus 
      PropertyChanges { target: contentHorizontal; color: "#FFFF00"; scale: 1} 
      PropertyChanges { target: insideConHorizontal; color: "#F98F06" } 
      PropertyChanges { target: labelHorizontal; color: "#0E2687"} 
     } 

    } 
} 
ListView { 
    id: horizontalna2 
    anchors.top: horizontalna.bottom 
    boundsBehavior: Flickable.StopAtBounds 
    width: 500 
    height: 60; 
    focus: true 
    model: model2 
    orientation: ListView.Horizontal 

    onContentXChanged: { 
     if (horizontalna2.activeFocus === true) 
     { 
      horizontalna.contentX = horizontalna2.contentX 

     } 
    } 
    delegate: Item { 
     id: containerHorizontal2 
     width: itemwidth; height: 60; 

     Rectangle { 
      id: contentHorizontal2 
      anchors.centerIn: parent; width: containerHorizontal2.width; height: containerHorizontal2.height - 10 
      color: "transparent" 
      antialiasing: true 

      Rectangle { id: insideConHorizontal2; anchors.fill: parent; anchors.margins: 3; color: "grey"; antialiasing: true; radius: 5 
       Text { 
        id:labelHorizontal2 
        color: "white" 
        text: "name" 
       } 
      } 
     } 
     states: State { 
      name: "active"; when: containerHorizontal2.activeFocus 
      PropertyChanges { target: contentHorizontal2; color: "#FFFF00"; scale: 1} 
      PropertyChanges { target: insideConHorizontal2; color: "#F98F06" } 
      PropertyChanges { target: labelHorizontal2; color: "#0E2687"} 
     } 
    } 
} 

}

EDIT [gelöst]: Erhalten Index der erste sichtbare Element der zweiten Liste in Abhängigkeit von contentX -> Funktion indexAt()

onCurrentIndexChanged: { 
        if (horizontalna.activeFocus === true) 
        { 
         horizontalna2.currentIndex = horizontalna2.indexAt((horizontalna2.contentX),0) 
        } 
       } 

Antwort

1

Get i Index der ersten sichtbaren Position der zweiten Liste abhängig von contentX -> function indexAt()