5.1.8 • Published 9 months ago

@nstudio/ui-collectionview v5.1.8

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
9 months ago

All credits to farfromrefug for @nativescript-community/ui-collectionview.

This customizes the community plugin to support:

  • Adjusting cell behavior for more custom layouts
  • Improved Angular support
iOS DemoAndroid Demo

Table of Contents

Installation

Run the following command from the root of your project:

npm install @nstudio/ui-collectionview

API

Events

PropertyDescription
itemLoadingTriggered when generating an item in the CollectionView.
itemTapTriggered when the user taps on an item in the CollectionView.
loadMoreItemsTriggered when the generated items reached the end of the items property.
scrollTriggered on collectionview scroll.
scrollEndTriggered on collectionview scroll end.
itemReorderStartingTriggered when a reorder is starting. Changing the returnValue of the event data allows you to cancel it
itemReorderStartedTriggered when a reorder started.
itemReorderedTriggered when a reorder finished.
dataPopulatedTriggered when a refresh has been called.

Properties

PropertyTypeDescription
iosUICollectionViewGets the native iOS view that represents the user interface for this component. Valid only when running on iOS.
androidandroid.support.v7.widget.RecyclerViewGets the native android widget that represents the user interface for this component. Valid only when running on Android OS.
itemsarray or ItemsSourceGets or sets the items collection of the CollectionView. The items property can be set to an array or an object defining length and getItem(index) method.
itemTemplatestringGets or sets the item template of the CollectionView.
rowHeightPercentLengthGets or sets the height for every row in the CollectionView.
colWidthPercentLengthGets or sets the width for every column in the CollectionView.
spanSizefunctionTriggered when an item is loaded. Returns the number of columns that the element should occupy taking into account colWidth when the device is vertical and rowHeight when horizontal. Parameters: (item, index: number).
scrollOffsetnumberGets the current scroll.
orientationvertical or horizontalSets the orientation of the CollectionView. Defaults to vertical.

Methods

NameReturnDescription
refresh()voidForces the CollectionView to reload all its items.
refreshVisibleItem()voidForces CollectionView to reload visible items.
scrollToIndex(index: number, animated: boolean = true)voidScrolls the CollectionView to the item with the given index. This can be either animated or not. Defaults to animated.
isItemAtIndexVisible(index: number)booleanReturns a boolean indicating whether the item is visible.

Usage

You need to add xmlns:gv="@nstudio/ui-collectionview" to your page tag, and then simply use <gv:CollectionView/> in order to add the widget to your page. Use <gv:Gridview.itemTemplate/> to specify the template for each cell:

Simple Example

Create a simple array of objects in your JS/TS file.

const items = [
    { index: 0, name: 'TURQUOISE', color: '#1abc9c' },
    { index: 1, name: 'EMERALD', color: '#2ecc71' },
    { index: 2, name: 'PETER RIVER', color: '#3498db' },
    { index: 3, name: 'AMETHYST', color: '#9b59b6' },
    { index: 4, name: 'WET ASPHALT', color: '#34495e' },
    { index: 5, name: 'GREEN SEA', color: '#16a085' },
    { index: 6, name: 'NEPHRITIS', color: '#27ae60' },
    { index: 7, name: 'BELIZE HOLE', color: '#2980b9' },
    { index: 8, name: 'WISTERIA', color: '#8e44ad' },
    { index: 9, name: 'MIDNIGHT BLUE', color: '#2c3e50' }
];
<!-- test-page.xml -->
<Page xmlns="http://schemas.nativescript.org/tns.xsd" xmlns:gv="@nstudio/ui-collectionview" loaded="pageLoaded">
    <GridLayout>
        <gv:CollectionView items="items" colWidth="50%" rowHeight="100">
            <gv:CollectionView.itemTemplate>
                <Label text="value" verticalAlignment="center"/>
            </gv:CollectionView.itemTemplate>
        </gv:CollectionView>
    </GridLayout>
</Page>

Templates Example

You can also have multiple templates the same way you add them in the builtin ListView control:

<gv:CollectionView id="gv" row="0" class="cssClass" items="items" 
                colWidth="colWidth" rowHeight="rowHeight" itemTemplateSelector="templateSelector"
                itemTap="gridViewItemTap" itemLoading="gridViewItemLoading" loadMoreItems="gridViewLoadMoreItems">
    <gv:CollectionView.itemTemplates>
        <template key="odd">
            <GridLayout backgroundColor="#33ffff" style="margin: 10 10 0 0">
                <Label text="value" verticalAlignment="center"/>
            </GridLayout>
        </template>

        <template key="even">
            <GridLayout backgroundColor="#33ffff" rows="auto, auto" style="margin: 10 10 0 0">
                <Label row="0" text="value" verticalAlignment="center"/>
                <Label row="1" text="value" verticalAlignment="center"/>
            </GridLayout>
        </template>
    </gv:CollectionView.itemTemplates>
</gv:CollectionView>
export function templateSelector(item: any, index: number, items: any) {
    return index % 2 === 0 ? "even" : "odd";
}

Usage in Angular

Import the module into your project.

import { CollectionViewModule } from '@nstudio/ui-collectionview/angular';

@NgModule({
    imports: [
        CollectionViewModule,
    ],
})

Simple Example

Create a simple array of objects in your Typescript file.

items = [
    { index: 0, name: 'TURQUOISE', color: '#1abc9c' },
    { index: 1, name: 'EMERALD', color: '#2ecc71' },
    { index: 2, name: 'PETER RIVER', color: '#3498db' },
    { index: 3, name: 'AMETHYST', color: '#9b59b6' },
    { index: 4, name: 'WET ASPHALT', color: '#34495e' },
    { index: 5, name: 'GREEN SEA', color: '#16a085' },
    { index: 6, name: 'NEPHRITIS', color: '#27ae60' },
    { index: 7, name: 'BELIZE HOLE', color: '#2980b9' },
    { index: 8, name: 'WISTERIA', color: '#8e44ad' },
    { index: 9, name: 'MIDNIGHT BLUE', color: '#2c3e50' }
];

Add the following to your component HTML.

<CollectionView [items]="items" colWidth="50%" rowHeight="100">
    <ng-template let-item="item">
        <Label [text]="item.name"></Label>
    </ng-template>
</CollectionView>

Templates Example

If you want to use multiple item templates, you can do that very similarly to how you do it for the builtin ListView control. The only difference is that due to current limitations instead of using the nsTemplateKey directive you need to use the cvTemplateKey directive that comes from the CollectionView. (In a future version, once the framework allows it this will be changed and you will be able to use the same directive for the CollectionView as well)

<CollectionView row="1" [items]="items" colWidth="33%" rowHeight="100" [itemTemplateSelector]="templateSelector">
    <ng-template cvTemplateKey="Defender" let-item="item" let-odd="odd">
        <StackLayout [nsRouterLink]="['/item', item.id]" borderColor="blue" borderWidth="2" borderRadius="5" verticalAlignment="stretch" class="list-group-item" [class.odd]="odd">
        <Label verticalAlignment="center" [text]="item.name" class="list-group-item-text" textWrap="true"></Label>
        </StackLayout>
    </ng-template>

    <ng-template cvTemplateKey="Goalkeeper" let-item="item" let-odd="odd">
        <StackLayout [nsRouterLink]="['/item', item.id]" borderColor="black" borderWidth="2" borderRadius="5" verticalAlignment="stretch" class="list-group-item" [class.odd]="odd">
        <Label verticalAlignment="center" [text]="item.name" class="list-group-item-text" textWrap="true"></Label>
        </StackLayout>
    </ng-template>

    <ng-template cvTemplateKey="Midfielder" let-item="item" let-odd="odd">
        <StackLayout [nsRouterLink]="['/item', item.id]" borderColor="yellow" borderWidth="2" borderRadius="5" verticalAlignment="stretch" class="list-group-item" [class.odd]="odd">
        <Label verticalAlignment="center" [text]="item.name" class="list-group-item-text" textWrap="true"></Label>
        </StackLayout>
    </ng-template>

    <ng-template cvTemplateKey="Forward" let-item="item" let-odd="odd">
        <StackLayout [nsRouterLink]="['/item', item.id]" borderColor="red" borderWidth="2" borderRadius="5" verticalAlignment="stretch" class="list-group-item" [class.odd]="odd">
        <Label verticalAlignment="center" [text]="item.name" class="list-group-item-text" textWrap="true"></Label>
        </StackLayout>
    </ng-template>
</CollectionView>

For a more complete example, look in the demo-ng directory.

Usage in Vue

Register the plugin in your app.ts.

import CollectionView from '@nstudio/ui-collectionview/vue';
Vue.use(CollectionView);

Simple Example

In your component, add the following to make a simple array of objects.

export default {
    // ...
    data() {
        const items = [
            { index: 0, name: 'TURQUOISE', color: '#1abc9c' },
            { index: 1, name: 'EMERALD', color: '#2ecc71' },
            { index: 2, name: 'PETER RIVER', color: '#3498db' },
            { index: 3, name: 'AMETHYST', color: '#9b59b6' },
            { index: 4, name: 'WET ASPHALT', color: '#34495e' },
            { index: 5, name: 'GREEN SEA', color: '#16a085' },
            { index: 6, name: 'NEPHRITIS', color: '#27ae60' },
            { index: 7, name: 'BELIZE HOLE', color: '#2980b9' },
            { index: 8, name: 'WISTERIA', color: '#8e44ad' },
            { index: 9, name: 'MIDNIGHT BLUE', color: '#2c3e50' }
        ];
        return {
            itemList: items
        };
    },
    // ...
};

Then add the following XML to your component.

<CollectionView
    :items="itemList"
    colWidth="50%"
    rowHeight="100"
>
    <v-template>
        <Label :text="item.name"></Label>
    </v-template>
</CollectionView>

For a more complete example, look in the demo-vue directory.

Usage in Svelte

Register the plugin in your app.ts.

import CollectionViewElement from '@nstudio/ui-collectionview/svelte';
CollectionViewElement.register();

Simple Example

In you component, add the following to import Svelte Templates and to create a simple array of objects.

import { Template } from 'svelte-native/components';

const items = [
    { index: 0, name: 'TURQUOISE', color: '#1abc9c' },
    { index: 1, name: 'EMERALD', color: '#2ecc71' },
    { index: 2, name: 'PETER RIVER', color: '#3498db' },
    { index: 3, name: 'AMETHYST', color: '#9b59b6' },
    { index: 4, name: 'WET ASPHALT', color: '#34495e' },
    { index: 5, name: 'GREEN SEA', color: '#16a085' },
    { index: 6, name: 'NEPHRITIS', color: '#27ae60' },
    { index: 7, name: 'BELIZE HOLE', color: '#2980b9' },
    { index: 8, name: 'WISTERIA', color: '#8e44ad' },
    { index: 9, name: 'MIDNIGHT BLUE', color: '#2c3e50' }
];

Then add the following XML to your component:

<collectionView 
    {items} 
    colWidth="50%"
    rowHeight="100"
>
    <Template let:item>
        <label text="{item.name}" />
    </Template>
</collectionView>

For a more complete example, look in the demo-svelte directory.

Usage in React

Register the plugin in your app.ts.

import { registerCollectionView } from '@nstudio/ui-collectionview/react';
registerCollectionView();

Simple Example

In your component, add the following code to create a simple list.

import { CollectionView } from '@nstudio/ui-collectionview/react';

const items = [
    { index: 0, name: 'TURQUOISE', color: '#1abc9c' },
    { index: 1, name: 'EMERALD', color: '#2ecc71' },
    { index: 2, name: 'PETER RIVER', color: '#3498db' },
    { index: 3, name: 'AMETHYST', color: '#9b59b6' },
    { index: 4, name: 'WET ASPHALT', color: '#34495e' },
    { index: 5, name: 'GREEN SEA', color: '#16a085' },
    { index: 6, name: 'NEPHRITIS', color: '#27ae60' },
    { index: 7, name: 'BELIZE HOLE', color: '#2980b9' },
    { index: 8, name: 'WISTERIA', color: '#8e44ad' },
    { index: 9, name: 'MIDNIGHT BLUE', color: '#2c3e50' }
];

interface Item {
    index: number;
    name: string;
    color: string;
}

const cellFactory = (item: Item) => (
    <label text={item.name} />
);

export function First() {
    return (
        <CollectionView items={items} colWidth="50%" rowHeight="100" cellFactory={cellFactory} width="100%" height="100%" />
    );
}

Questions

If you have any questions/issues/comments please feel free to create an issue or start a conversation in the NativeScript Community Discord.