Как мне использовать компонент SplitViewNavigator, чтобы показать навигацию Master / Detail во Flex - PullRequest
0 голосов
/ 10 февраля 2012

У меня проблема с использованием компонента SplitViewNavigator в flex 4.6 с использованием Adobe Flash Builder.

[ОБНОВЛЕНО] * * *

Я создаю приложение Reddit для планшета Blackberry Playbook, и я использую API Reddit.У меня есть три представления mxml: RedditReaderHomeView.mxml, redditFeed.mxml и subredditList.mxml.В RedditReaderHomeView.mxml у меня есть splitViewNavigator.В левой части моего SplitViewNavigator находится subredditList.mxml, а справа - redditFeed.mxml.При инициализации redditFeed.mxml извлекает данные XML, чтобы заполнить свой список записями reddit, а subredditList.mxml извлекает данные XML, которые заполняют его список отображаемыми субредитами (категориями).Когда пользователь нажимает на записи subreddit слева, redditFeed.mxml справа должен обновиться, чтобы данные, которые он извлекал, были записями из категории subreddit, которая была выбрана слева.Другими словами, классический мастер / детализация навигации.Категория слева, которая открывает записи этой категории справа.

Ну, у меня есть функция, которая передает URL выбранного subreddit в redditFeed.mxml.

subredditList.mxml - здесь выбирается subreddit, и его URL-адрес отправляется функции в redditFeed.mxml

public function list_clickHandler(event:IndexChangeEvent):void {
                var RSSItem:Object = redditList.dataProvider.getItemAt(event.newIndex);
                var thisItem:Item = RSSItem as Item;
                rlink = thisItem.link;
                var moddedLink:String = rlink.slice(1, int.MAX_VALUE)
                var pushSub:redditFeed = new redditFeed();
                pushSub.myList_creationCompleteHandler(moddedLink);
            }

redditFeed.mxml - URL-адрес используется для получения данных из этого конкретного subreddit ...

public function myList_creationCompleteHandler(url:String):void
            { 
                getRedditFeedResult.token = redditFeedGrabber.getRedditFeed(url);
            }

... хотя кажется, что эти данные никогда не отображаются в компоненте списка искры, даже если я вижу вызовделается через сетевой монитор.Я часами пытался решить эту проблему.И я полагаю, что это как-то связано с тем, что представления являются «активными» и «деактивированными», поскольку, когда я пытался выполнить этот же вызов из redditFeed.mxml, вызов прошел и данные в списке обновились.Я подумал, возможно, это потому, что действие выполнялось в том же представлении, которое содержит список, в котором отображаются данные.Так что в этом случае он будет «активным», поскольку в этом представлении выполняется действие.

Я ценю любую помощь, которую может предложить любой.Кроме того, не стесняйтесь просить разъяснения / более подробную информацию от меня.Я действительно хочу решить это.Спасибо!

RedditReaderHomeView.mxml - вот код, который вы запросили.Дай мне знать, если тебе нужно больше / что-то еще.

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        actionBarVisible="false" tabBarVisible="true" title="Reddit Reader by Domisy" creationPolicy="all"
        actionBarVisible.landscape="true">



    <fx:Script>
        <![CDATA[
            import com.adobe.fiber.core.model_public;
            import mx.events.FlexEvent;
            import views.redditFeed;

            public var defUrl:String = new String("");


            public function refreshRSS(event:Event):void
            {
                          //***UPDATED CODE****
                          var refreshFunction:Object = redditFeedNav.getElementAt(0);
                  refreshFunction.refreshList();


                          //var refreshFunction:redditFeed = new redditFeed();
            //refreshFunction.refreshList();                
            }
        ]]>

    </fx:Script>


    <fx:Declarations>

    </fx:Declarations>



    <s:states>
        <s:State name="portrait"/>
        <s:State name="landscape"/>
    </s:states>




    <s:actionContent>
        <s:Button includeIn="landscape" click="navigator.pushView(profileView)"
                  icon="@Embed('assets/images/profileIcon.png')"/>
    </s:actionContent>




    <s:SplitViewNavigator width="100%" height="100%" id="splitViewNavigator" autoHideFirstViewNavigator="true">
        <s:ViewNavigator id="redditListNav" firstView="views.subredditList" width="300" height="100%"/>
        <s:ViewNavigator id="redditFeedNav" firstView="views.redditFeed" width="100%" height="100%">



            <s:actionContent.landscape>
                <s:Button id="refreshButtonlLandscape" icon="@Embed('assets/refresh160.png')" click="refreshRSS(event)" />
            </s:actionContent.landscape>

            <s:actionContent.portrait>
                <s:Button id="refreshButton" icon="@Embed('assets/refresh160.png')" click="refreshRSS(event)" />
                <s:Button id="navigatorButton" label="Search" click="splitViewNavigator.showFirstViewNavigatorInPopUp(navigatorButton)" />
            </s:actionContent.portrait>
        </s:ViewNavigator>
    </s:SplitViewNavigator>


</s:View>

1 Ответ

0 голосов
/ 10 февраля 2012

Хорошо, я понимаю, в чем проблема, я думаю. Вы создаете новый экземпляр объекта redditFeed вместо того, чтобы использовать экземпляр, созданный в MXML. В вашем RedditReaderHomeView.mxml передайте объявление redditFeed id, затем в приведенной выше функции используйте его как:

private var redditFeedId:RedditFeed; //Passed in from RedditReaderHome, bound to the id of the actual one in there
public function list_clickHandler(event:IndexChangeEvent):void {
     var RSSItem:Object = redditList.dataProvider.getItemAt(event.newIndex);
     var thisItem:Item = RSSItem as Item;
     rlink = thisItem.link;
     var moddedLink:String = rlink.slice(1, int.MAX_VALUE)
     redditFeedId.myList_creationCompleteHandler(moddedLink);
 }

Вставьте в RedditReaderHome, если вам понадобится какая-либо помощь по этому вопросу.

Спасибо за продолжение [ДОБАВЛЕНО]

        public function refreshRSS(event : Event) : void
        {
            trace(redditFeedNav.getElementAt(0));
            redditFeedNav.getElementAt(0).refreshList(); 
        }
...