Nativescript Карусель управления не работает - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь использовать плагин Nativescript-Carousel для отображения нескольких мест Google. Однако всякий раз, когда я устанавливаю набор данных для управления каруселью, я получаю исключение

System.err: java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 20 Pager id: 9 Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.tns.gen.android.support.v4.view.PagerAdapter_index_222_28_CarouselPagerAdapterClassInner
System.err:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1135)
System.err:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1084)
System.err:     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at org.nativescript.widgets.CommonLayoutParams.measureChild(CommonLayoutParams.java:262)
System.err:     at org.nativescript.widgets.MeasureHelper.measureChildFixedColumnsAndRows(GridLayout.java:1055)
System.err:     at org.nativescript.widgets.MeasureHelper.measure(GridLayout.java:865)
System.err:     at org.nativescript.widgets.GridLayout.onMeasure(GridLayout.java:279)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at org.nativescript.widgets.CommonLayoutParams.measureChild(CommonLayoutParams.java:262)
System.err:     at org.nativescript.widgets.MeasureHelper.measureChildFixedColumnsAndRows(GridLayout.java:1055)
System.err:     at org.nativescript.widgets.MeasureHelper.measure(GridLayout.java:865)
System.err:     at org.nativescript.widgets.GridLayout.onMeasure(GridLayout.java:279)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at org.nativescript.widgets.CommonLayoutParams.measureChild(CommonLayoutParams.java:262)
System.err:     at org.nativescript.widgets.MeasureHelper.measureChildFixedColumnsAndRows(GridLayout.java:1055)
System.err:     at org.nativescript.widgets.MeasureHelper.measure(GridLayout.java:865)
System.err:     at org.nativescript.widgets.GridLayout.onMeasure(GridLayout.java:279)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at org.nativescript.widgets.CommonLayoutParams.measureChild(CommonLayoutParams.java:262)
System.err:     at org.nativescript.widgets.ContentLayout.onMeasure(ContentLayout.java:32)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
System.err:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
System.err:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
System.err:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
System.err:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
System.err:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
System.err:     at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
System.err:     at android.view.View.measure(View.java:19857)
System.err:     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
System.err:     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
System.err:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
System.err:     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
System.err:     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
System.err:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
System.err:     at android.view.Choreographer.doCallbacks(Choreographer.java:686)
System.err:     at android.view.Choreographer.doFrame(Choreographer.java:621)
System.err:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
System.err:     at android.os.Handler.handleCallback(Handler.java:751)
System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
System.err:     at android.os.Looper.loop(Looper.java:154)
System.err:     at android.app.ActivityThread.main(ActivityThread.java:6119)
System.err:     at java.lang.reflect.Method.invoke(Native Method)
System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Вот мой код

this.gpsLocationService.getGpsLocation()
            .then((location) => {

                this.latitude = location[0];
                this.longitude = location[1];

                this.nearesthelpService.getNearByPlaces(this.latitude, this.longitude, 5000, 'pharmacy')
                    .subscribe((res) => {
                        this.places = (<any>res).results;
                        console.dir(this.places)
                        let placeDetails: PlaceDetails[] = []
                        this.places.forEach((place) => {
                            this.nearesthelpService.getNearByPlaceDetails(place.reference).subscribe((details: PlaceDetails) => {
                                console.log(details.result.name);
                                placeDetails.push(details);

                                if (placeDetails.length === this.places.length){
                                    this.placeDetails = placeDetails;
                                }
                            })
                        });
                    });
            });

Также вот мой шаблон

<GridLayout row="1" *ngIf="placeDetails.length > 0">
        <Carousel #carousel (pageChanged)="onPageChanged($event)">
            <ng-template ngFor let-subitem [ngForOf]="placeDetails">
                <CarouselItem>
                    <GridView rows="auto,*">
                        <Label [text]="placedetail.result?.name"></Label>
                    </GridView>
                </CarouselItem>
            </ng-template>
        </Carousel>
    </GridLayout>

Я пробовал все по-разному, чтобы набор данных, привязанный к элементу управления Каруселью, больше не менялся. Как видно выше, я также сначала вычислил результаты в локальном объекте, а затем прикрепил его к переменной класса. Однако не повезло. Есть идеи, почему это не удается?

Просто добавьте, что если я назначаю источник данных как статический массив вместо placedetails, этот элемент управления не создает никаких проблем. Однако, когда результат назначается через результат API, он не работает.

Чтобы добавить, я прочитал на странице плагина, что угловое содержимое не может быть изменено динамически. Однако мое требование не состоит в том, чтобы изменять содержимое после его получения.

1 Ответ

0 голосов
/ 20 ноября 2018

К сожалению, нет ответа на этот вопрос. Страница Github упоминает, что

(Угловой) Работают только статические слайды, динамические с привязкой - нет (пока).

Я предполагал, что присвоение данных в первый раз пустому массиву все равно будет статическим слайдом. Однако похоже, что это не так. Если вы храните свои данные заранее, вы можете назначить их при самой инициализации.

...