I have 4 main blocks pages on one page with lists of products in different categories and Shopping cart page. 

I want by click on the custom button `Add to cart` (near each item on the product page) put selected items into the list or any other collection, which should be displayed on the Shopping cart page. 

I have this problem - everytime I click on the button my list of items stays empty. I tried different ways, but all I could get is only one item displayed. Somehow, selected items are not passed to the page, though I select them by chosen ID.

Here is the code for Shopping cart page:

      <apex:form id="cartForm" >
            <apex:outputPanel id="productsDetail">
                <apex:pageBlock title="Your Shopping Cart" id="cartBlock">
                    <apex:pageBlockTable value="{!shoppingCart}" var="item">
                        <apex:column >
                            <apex:commandLink value="{!item.Name}" >
                                <apex:param name="id" value="{!chosenItemId}"/>
                            </apex:commandLink>
                            <apex:pageBlockSection >
                                <apex:outputText value="{!item.Price__c}" id="itemPrice"/><br/>
                            </apex:pageBlockSection>-->
                            <apex:commandButton value="Buy" action="{!buyProduct}" id="buyButton"></apex:commandButton>
                        </apex:column>
                    </apex:pageBlockTable>
                </apex:pageBlock>
            </apex:outputPanel>
        </apex:form>

Common controller for all 4 pages with only relevant for this task methods and variables:

     public with sharing class ProductPagesController {
    public List<Product__c> shoppingCart { set; get; }
    public Set<String> selectedIds { set; get; }
    private String currentPage =   ApexPages.currentPage().getParameters().get('Id');
    public Id chosenItemId { set; get; }
    public List<Product__c> tvsList { set; get; }

    public ProductPagesController() {
        renderTV = false;
        renderShoppingCart = false;
        tvsList = selectTVsList();
        selectedIds = new Set<String>();
        shoppingCart = new List<Product__c>();
    }

    private Product__c selectedItems(Id itemId) {
        Product__c items = [
                SELECT Id
                        , Name
                        , Price__c
                        , Description__c
                        , Image__c
                        , Quantity__c
                FROM Product__c
                WHERE Id=:itemId
        ];
        return items;
    }

     public PageReference addProductToShoppingCart() {
         Product__c shoppingCartItem;
            for(Id itemId : selectedIds){
                shoppingCartItem = selectedItems(itemId);
                shoppingCart.add(shoppingCartItem);
            }

            update shoppingCart;
            return null;
        }
    }



One of the products page (TV category):

    <apex:form id="tvsForm">
            <apex:outputPanel id="tvsDetail">
                <apex:pageBlock title="TVs" id="tvsBlock">
                    <apex:pageBlockTable value="{!tvsList}" var="tv">
                        <apex:column >
                            <apex:commandLink value="{!tv.Name}" >
                                <apex:param name="id" value="{!tv.Id}"/>
                            </apex:commandLink>
                            <apex:pageBlockSection >
                                <apex:image value="{!URLFOR($Resource.TV, tvsImages[tv.Name])}" id="tvImage"/>
                            </apex:pageBlockSection>
                            <apex:pageBlockSection >
                                <apex:outputText value="{!tv.Price__c}" id="tvPrice"/><br/>
                                <apex:outputText value="{!tv.Description__c}"/>
                            </apex:pageBlockSection>
                            <br/>
                            <apex:commandButton value="Add to cart" action="{!addProductToShoppingCart}" id="monitorButton" reRender="cartForm">
                                <apex:param name="itemsId" value="{!tv.Id}" assignTo="{!selectedIds}"></apex:param>

                            </apex:commandButton>
                            <br/><br/>
                        </apex:column>
                    </apex:pageBlockTable>

                    <apex:pageBlockSection >
                        <apex:outputText value="There are {!tvsQuantity} products in this category" id="productsNumber"/><br/>
                    </apex:pageBlockSection>
                </apex:pageBlock>
            </apex:outputPanel>
        </apex:form>