@Override
    public void bind(StickerLine data, int position, Context context) {
      ll.removeAllViews();
      ll.setTag(TAG_KEY, data.getPackCount());
      for (final Sticker s : data.getLine()) {
        StickerView sv;
        if (s != null && s.getFileReference256() != null) {

          sv = stickersCache.get(s.getFileReference128().getFileId());
          if (sv == null) {
            sv = new StickerView(context);
            sv.setPadding(STICKER_PADDING, STICKER_PADDING, STICKER_PADDING, STICKER_PADDING);
            sv.bind(s.getFileReference128(), STICKER_SIZE);
            stickersCache.put(s.getFileReference128().getFileId(), sv);

          } else if (sv.isLoaded()) {
            if (sv.getParent() != null) {
              ((LinearLayout) sv.getParent()).removeView(sv);
            }
            sv.shortenFade();
          }

          sv.setOnClickListener(
              new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  keyboard.onStickerClicked(s);
                }
              });
          ll.addView(sv, stikerlp);
        }
      }
    }
  private void buildStickerLines(final ScrollTo scrollTo) {

    // BUILD SWITCH
    keyboard.getStickerIndicatorContainer().removeAllViews();

    // Add pack switch buttons
    int packCount = 0;
    totalLines = 0;
    for (final StickerPackVM pack : packs.get()) {
      ((BaseActivity) context)
          .bind(
              pack.getStickers(),
              new ValueChangedListener<ArrayList<Sticker>>() {
                @Override
                public void onChanged(
                    ArrayList<Sticker> val, Value<ArrayList<Sticker>> valueModel) {
                  buildStickerLines(scrollTo);
                  notifyDataSetChanged();
                }
              },
              false);
      if (pack.getStickers().get().size() < 1) {
        continue;
      }
      // Count lines
      int linesInPack = (int) Math.ceil((double) pack.getStickers().get().size() / stickerInLine);
      totalLines += linesInPack;

      // Build packs buttons
      final StickerView sv = new StickerView(context);

      sv.bind(pack.getStickers().get().get(0).getFileReference128(), Screen.dp(48));
      sv.setPadding(padding, padding, padding, padding);
      sv.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              scrollTo.requestScroll(packFirstLineMap.get(pack.getId()));
              selectCurrentPack((Integer) sv.getTag(TAG_KEY));
            }
          });
      sv.setTag(TAG_KEY, packCount);
      keyboard.getStickerIndicatorContainer().addView(sv, stickerSwitchLp);
      packCount++;
    }
    if (stickerIndicatorContainer.getChildAt(0) != null) {
      stickerIndicatorContainer
          .getChildAt(0)
          .setBackgroundColor(context.getResources().getColor(R.color.selector_selected));
    }

    // BUILD LINES
    // All lines stored here
    stickerLines = new StickerLine[totalLines];

    // Fill lines with packs stickers
    int allLinesCount = 0;
    int linePackCount = 0;
    for (StickerPackVM pack : packs.get()) {
      if (pack.getStickers().get().size() < 1) {
        continue;
      }
      int stickerInPack = 0;
      int linesInPack = (int) Math.ceil((double) pack.getStickers().get().size() / stickerInLine);

      // Loop pack lines
      for (int lineInPackCount = 0;
          lineInPackCount < linesInPack;
          lineInPackCount++, allLinesCount++) {
        StickerLine line = new StickerLine(new Sticker[stickerInLine], linePackCount);
        // Remember pack first line position
        if (lineInPackCount == 0) {
          packFirstLineMap.put(pack.getId(), allLinesCount);
        }
        // Fill line with stickers
        for (int stickerInLine = 0;
            stickerInLine < this.stickerInLine;
            stickerInLine++, stickerInPack++) {
          if (stickerInPack < pack.getStickers().get().size()) {
            line.getLine()[stickerInLine] = pack.getStickers().get().get(stickerInPack);
          } else {
            break;
          }
        }
        stickerLines[allLinesCount] = line;
      }
      linePackCount++;
    }
  }