2013-10-01 2 views
0

스크롤 한 후 첫 번째 방향 만 변경하면 인덱스를 변경하는 변수 row_height (사용자 정의 항목 렌더러 2 개 : 헤더 30px, 연락처 60px)가있는 스파크 목록이 있습니다. 보기에서.플렉스 : 오리엔테이션 변경시보기에서 스파크리스트의 인디스

헤더를 60 픽셀 높이로 설정하려고 시도했는데 방향 변경에 문제가 없었습니다.

어디서나 verticalScrollPosition을 설정하지 않습니다. 뷰포트의 목록에 이벤트 리스너를 추가하고 verticalScrollPosition을 보면 방향 변경시 변경되지 않습니다.

정말 어떻게 해결할 수 있는지 모르겠습니다.

편집 :

<fx:Script> 
protected function creationCompleteHandler(event:FlexEvent):void 
{ 
    addressBookViewModel = ViewModelFactory.getInstance().getAddressBookViewModel(); 
    addressBookViewModel.getUserContacts(onDataReceived); 
} 

protected function pagedContactsList_initializeHandler(event:FlexEvent):void 
{ 
    asyncListView.list = pagedContactsList; 
} 

private function onDataReceived():void 
{ 
    pagedContactsList.length = (BusinessContext.getInstance().getTotalContacts() + BusinessContext.getInstance().getTotalLastNames()); 
    loadPagedData(); 
} 

private function createPendingItemFunctionHandler(index:int, ipe:ItemPendingError):Object 
{ 
    if(!addressBookViewModel.pageUp) 
    { 
     addressBookViewModel.pageUp = true; 
     addressBookViewModel.currentPage++;      
     addressBookViewModel.getMoreUserContacts(onMoreDataRecieved, onMoreDataMissing); 
    } 
    return loadingDataHeader; 
} 

private function onMoreDataRecieved():void 
{ 
    loadPagedData(); 
} 

private function loadPagedData():void 
{ 
    for(var i:int = 0; i < addressBookViewModel.contacts.length; i++) 
    { 
     pagedContactsList.setItemAt(addressBookViewModel.contacts.getItemAt(i), pagedContactsList.lastItemInsertedIndex); 
     pagedContactsList.lastItemInsertedIndex++; 
    } 
    addressBookViewModel.pageUp = false; 
} 

internal var headerItemRender:ClassFactory = new ClassFactory(HeaderItemRenderer); 
internal var contactItemRenderer:ClassFactory = new ClassFactory(ContactItemRenderer); 

private function rendererFunction(item:Object):ClassFactory 
{ 
    return item.hasOwnProperty("isHeader") ? headerItemRender : contactItemRenderer; 
} 

</fx:Script> 

<fx:Declarations> 
    <custom:PagedArrayList id="pagedContactsList" initialize="pagedContactsList_initializeHandler(event)"/> 
</fx:Declarations> 

<s:List id="list" width="100%" 
     height="100%" itemRendererFunction="rendererFunction" change="list1_changeHandler(event)"> 
    <s:AsyncListView id="asyncListView" createPendingItemFunction="createPendingItemFunctionHandler" /> 
</s:List> 

호기심 것은이 방향 변경 후 list.scroller.viewport.verticalScrollPosition가 같은 값도 목록이있는 경우가 있습니다 그 전에하고 있습니다 : 이 목록에 코드 상대입니다 ~ 40 행을 스크롤했습니다. (40은 페이지 크기 임).

내 응용 프로그램에 많은 목록이 있고 const row_height가있는 모든 목록에는 문제가 없지만 row_height 변수가있는 2 개에는이 문제가 있습니다. 어쩌면 그것은 AsyncListView에 의한 것일 수 있습니다.

편집 2 :

내가 AsyncListView을 제거 직접 바인딩 매김 제거는 List.dataProvider를에 addressBookViewModel.contacts하고 문제는 여전히 존재한다.

편집 3 :

내가 할 수있는 유일한 일이 스크롤러의 클래스 도처에서 중단 점을 넣어라고 생각합니다.

EDIT 4 : 목록의 맨 아래로 스크롤 할 때

이 문제는 발생합니다.

편집 5 :

문제를 찾아라! VerticalLayout.as, updateDisplayListVirtual (1797 행)에는 typicalLayoutElement를 사용하여 LinearLayoutVector를 설정하는 메서드 (updateLLV)가 호출됩니다. lazily init이며 목록의 dataGroup에 첫 번째 itemRenderer가 추가됩니다. 필자의 경우 HeaderItemRenderer (30px)입니다.

updateLLV 뒤에 LinearLayoutVector에서 indexOf를 호출하고 verticalScrollPosition을 전달하여 startIndex (첫 번째 표시 항목의 인덱스)를 설정합니다. (간단히 : verticalScrollPosition/typicalLayoutElement.height)

문제는 아무 것도 변수 rotoweight!

+0

모바일 앱에서이 문제를 발견 한 적이 없습니다. 간단한 테스트 케이스 (게시 할 수 있음)에서 수행합니까? – drkstr1

+0

목록과 관련된 코드를 추가했습니다. – Christopher

답변

0

해결 방법을 찾았습니다! 그렇게 우아한 것은 아니지만 작동합니다.

stage.eventListener(StageOrientationEvent.ORIENTATION_CHANGING, yourReorientHandler, false, 1) 

우선 순위를 설정하는 것이 중요합니다. 그렇지 않으면 updateDisplayListVirtual이 처리기보다 먼저 호출됩니다.

private function reorientHandler(event:StageOrientationEvent):void 
{ 
    var IndecesInView:Vector.<int> = list.dataGroup.getItemIndicesInView(); 
    var firstInView:int = IndecesInView[0]; 
    callLater(
     function():void 
     { 
      if(!list.layout.getScrollPositionDeltaToElement(firstInView+1)) return; 
      list.scroller.viewport.verticalScrollPosition += list.layout.getScrollPositionDeltaToElement(firstInView+1).y; 
     }); 
}