@Override
    public View getView(final int position, final View convertView, final ViewGroup parent) {
      final ViewGroup row;
      if (convertView == null)
        row = (ViewGroup) getLayoutInflater(null).inflate(R.layout.block_row, null);
      else row = (ViewGroup) convertView;

      final StoredBlock storedBlock = getItem(position);
      final Block header = storedBlock.getHeader();

      final TextView rowHeight = (TextView) row.findViewById(R.id.block_list_row_height);
      final int height = storedBlock.getHeight();
      rowHeight.setText(Integer.toString(height));

      final TextView rowTime = (TextView) row.findViewById(R.id.block_list_row_time);
      final long timeMs = header.getTimeSeconds() * DateUtils.SECOND_IN_MILLIS;
      rowTime.setText(
          DateUtils.getRelativeDateTimeString(
              activity, timeMs, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0));

      final TextView rowHash = (TextView) row.findViewById(R.id.block_list_row_hash);
      rowHash.setText(WalletUtils.formatHash(null, header.getHashAsString(), 8, 0, ' '));

      final int transactionChildCount = row.getChildCount() - ROW_BASE_CHILD_COUNT;
      int iTransactionView = 0;

      if (transactions != null) {
        final String precision =
            prefs.getString(
                Constants.PREFS_KEY_BTC_PRECISION, Constants.PREFS_DEFAULT_BTC_PRECISION);
        final int btcPrecision = precision.charAt(0) - '0';
        final int btcShift = precision.length() == 3 ? precision.charAt(2) - '0' : 0;

        transactionsAdapter.setPrecision(btcPrecision, btcShift);

        for (final Transaction tx : transactions) {
          if (tx.getAppearsInHashes().containsKey(header.getHash())) {
            final View view;
            if (iTransactionView < transactionChildCount) {
              view = row.getChildAt(ROW_INSERT_INDEX + iTransactionView);
            } else {
              view = getLayoutInflater(null).inflate(R.layout.transaction_row_oneline, null);
              row.addView(view, ROW_INSERT_INDEX + iTransactionView);
            }

            transactionsAdapter.bindView(view, tx);

            iTransactionView++;
          }
        }
      }

      final int leftoverTransactionViews = transactionChildCount - iTransactionView;
      if (leftoverTransactionViews > 0)
        row.removeViews(ROW_INSERT_INDEX + iTransactionView, leftoverTransactionViews);

      return row;
    }
  @Test
  public void testRemoveViews() {
    root.removeViews(0, 0);
    assertThat(root.getChildCount(), equalTo(3));

    root.removeViews(2, 1);
    assertThat(root.getChildCount(), equalTo(2));
    assertThat(root.getChildAt(0), sameInstance(child1));
    assertThat(root.getChildAt(1), sameInstance(child2));

    root.removeViews(0, 1);
    assertThat(root.getChildCount(), equalTo(1));
    assertThat(root.getChildAt(0), sameInstance(child2));

    root.removeViews(0, 1);
    assertThat(root.getChildCount(), equalTo(0));

    root.addView(child1);
    root.addView(child2);
    root.addView(child3);

    root.removeViews(1, 1);
    assertThat(root.getChildCount(), equalTo(2));
    assertThat(root.getChildAt(0), sameInstance(child1));
    assertThat(root.getChildAt(1), sameInstance((View) child3));

    root.removeViews(0, 2);
    assertThat(root.getChildCount(), equalTo(0));
  }
 @Override
 public void removeViews(int start, int count) {
   mDirtyHierarchy = true;
   super.removeViews(start, count);
 }
 @Override
 public void removeViews(int start, int count) {
   super.removeViews(start, count);
   updateAngle();
 }