Block colision detection problems(off centered)

The problem i am having is when making the games block colliton center onto the blocks and for some reason the colision box is a few blocks NW from where it should be.
[tr][td]
Player file:
package com.AdamWalters.com.zain.mob;

import com.AdamWalters.com.zain.Level.Level;
import com.AdamWalters.com.zain.Level.tiles.Tile;
import com.AdamWalters.com.zain.graphics.Screen;
import com.AdamWalters.com.zain.graphics.Sprite;
import com.AdamWalters.com.zain.input.InputHandler;

public class Player extends Mob {

private InputHandler input;
private Sprite sprite;
private int anim = 0;
private boolean walking = false;

static final int maxHealth = 2000;
static int health = 2000;

int speed = 40;

public Player(Level level, int x, int y, InputHandler input) {
    super(level, "Player", x, y, 1);
    this.input = input;
    sprite = Sprite.player_forward;
}


public void update() {
	boolean running;
	int xa = 0, ya = 0;
	if (anim < 7500)
		anim++;
	else
		anim = 0;
	if (input.shift){
		running = true;
		speed  = 20;
	}else{
		running = false;
		speed  = 40;
	}
	if (input.up&&running)
		ya--;
	if (input.down&&running)
		ya++;
	if (input.left&&running)
		xa--;
	if (input.right&&running)
		xa++;
	
	if (input.up)
		ya--;
	if (input.down)
		ya++;
	if (input.left)
		xa--;
	if (input.right)
		xa++;

	if (xa != 0 || ya != 0) {
		move(xa, ya);
		walking = true;
	} else {
		walking = false;
	}
}

public void render(Screen screen) {
	int flip = 0;
	if (dir == 2) {
		sprite = Sprite.player_forward;
		if (walking) {
			if (anim % speed > speed/2) {
				sprite = Sprite.player_forward_1;
			} else {
				sprite = Sprite.player_forward_2;

			}
		}
	}
	if (dir == 1) {
		sprite = Sprite.player_side;
		if (walking) {
			if (anim % speed > speed/2) {
				sprite = Sprite.player_side_1;
			} else {
				sprite = Sprite.player_side_2;
			}
		}
	}
	if (dir == 0) {
		sprite = Sprite.player_back;
		if (walking) {
			if (anim % speed > speed/2) {
				sprite = Sprite.player_back_1;
			} else {
				sprite = Sprite.player_back_2;
			}
		}
	}

	if (dir == 3) {
		sprite = Sprite.player_side;
		if (walking) {
			if (anim % speed > speed/2) {
				sprite = Sprite.player_side_1;
			} else {
				sprite = Sprite.player_side_2;
			}

		}
		flip = 1;
	}//this has to be changed for the player sprite. e.g. 16 for 32 * 32 sprites and 32 for 16 * 16 sprites.
	screen.renderPlayer(x - 16, y - 16, sprite, flip);
}

public boolean hasCollided(int xa, int ya) {
    int xMin = 0;
    int xMax = 15;
    int yMin = 7;
    int yMax = 15;
    for (int x = xMin; x < xMax; x++) {
        if (isSolidTile(xa, ya, x, yMin)) {
            return true;
        }
    }
    for (int x = xMin; x < xMax; x++) {
        if (isSolidTile(xa, ya, x, yMax)) {
            return true;
        }
    }
    for (int y = yMin; y < yMax; y++) {
        if (isSolidTile(xa, ya, xMin, y)) {
            return true;
        }
    }
    for (int y = yMin; y < yMax; y++) {
        if (isSolidTile(xa, ya, xMax, y)) {
            return true;
        }
    }
    return false;
}

public static int getHealthPersentage() {
	int persentage;
	persentage = (health/100)/maxHealth;
	return persentage;
}
public static int maxHealth(){
	return maxHealth;
}
public static int health(){
	return health;
}
public static void addDamage(int damage){
	health = health - damage;
}

}

[tr][td]
mob file:
package com.AdamWalters.com.zain.mob;

import com.AdamWalters.com.zain.Level.Level;
import com.AdamWalters.com.zain.Level.tiles.Tile;
import com.AdamWalters.com.zain.entity.Entity;
import com.AdamWalters.com.zain.graphics.Sprite;

public abstract class Mob extends Entity {

protected Sprite sprite;
protected int dir = 0;	// 0 = north, 1 = east, 2 = south, 3 = west
protected boolean moving = false;
int speed;

public Mob(Level level, String name, int x, int y, int speed) {
    super(level);
    this.x = x;
    this.y = y;
    this.speed = speed;
}


public void move(int xa, int ya) {
	if (xa > 0) dir = 1;
	if (xa < 0) dir = 3;
	if (ya > 0) dir = 2;
	if (ya < 0) dir = 0;
	
    if (!hasCollided(xa, ya)) {
        if (ya < 0)
            dir = 0;
        if (ya > 0)
        	dir = 2;
        if (xa < 0)
        	dir = 3;
        if (xa > 0)
        	dir = 1;
        x += xa * 1;
        y += ya * 1;
    }
}
public abstract boolean hasCollided(int xa, int ya);
protected boolean isSolidTile(int xa, int ya, int x, int y) {
    if (level == null) {
        return false;
    }
    Tile lastTile = level.getTile((this.x + x) >> 7, (this.y + y) >> 7);
    Tile newTile = level.getTile((this.x + x + xa) >> 7, (this.y + y + ya) >> 7);
    if (!lastTile.equals(newTile) && newTile.isSolid()) {
        return true;
    }
    return false;
}

public void update() {
}

public void render() {
}

}

[tr][td]
level file:
package com.AdamWalters.com.zain.Level;

import com.AdamWalters.com.zain.graphics.Screen;
import com.AdamWalters.com.zain.Level.tiles.Tile;

public class Level {

protected static int width;
protected static int height;
protected int[] tilesInt;
protected static int[] tiles;

public static Level spawn = new SpawnLevel ("/levels/level.png");

public Level(int width, int height) {
	this.width = width;
	this.height = height;
	tilesInt = new int [width * height];
	generateLevel();
}

public Level(String path) {
	loadLevel(path);
	generateLevel();
}

protected void generateLevel() {
}

protected void loadLevel(String path) {
}

public void tick() {
}

@SuppressWarnings
("unused") private void time() {
}

public void render(int xScroll, int yScroll, Screen screen) {
	
    if (xScroll < 0)
    	xScroll = 0;
    if (xScroll > ((width << 3) - screen.width))
    	xScroll = ((width << 3) - screen.width);
    if (yScroll < 0)
    	yScroll = 0;
    if (yScroll > ((height << 3) - screen.height))
    	yScroll = ((height << 3) - screen.height);
	
	screen.setOffset(xScroll, yScroll);
	/** >> 4 = /16 **/
	int x0 = xScroll >> 4;
	int x1 = (xScroll + screen.width + 16) >> 4;
	int y0 = yScroll >> 4;
	int y1 = (yScroll + screen.height + 16) >> 4;
	for (int y = y0; y < y1; y++) {
		for (int x = x0; x < x1; x++) {
			getTile(x, y).render(x, y, screen);
		}
	}
}
//Grass = 0xFF00 / 0x00FF00
//Flower = 0xFFFF00
//Rock = 0x878787
//first two ff = 100% opaque & first two 00 = 100% transparent.
public Tile getTile(int x, int y) {
	if (x < 0 || y < 0 || x >= width || y >= height){
		return Tile.voidTile;
	}
	if (tiles[x + y * width] == Tile.col_spawn_grass){
		return Tile.grass;
	}
	if (tiles[x + y * width] == Tile.col_spawn_log){
		return Tile.log;
	}
	if (tiles[x + y * width] == Tile.col_spawn_leaves){
		return Tile.leaves;
	}
	return Tile.voidTile;
}
public static int getTileID(int x, int y) {
	if (x < 0 || y < 0 || x >= width || y >= height){
		return 1;
	}
	if (tiles[x + y * width] == Tile.col_spawn_grass){
		return 2;
	}
	if (tiles[x + y * width] == Tile.col_spawn_log){
		return 3;
	}
	if (tiles[x + y * width] == Tile.col_spawn_leaves){
		return 4;
	}
	return 1;
}

}

if anyone has a solution to this it would be appreciated if you left me a message or drop me a skype PM at :mythirdleg35