Faits: A. Le 16 décembre 2008, A._ a été arrêté et placé en détention préventive dans le cadre d'une instruction ouverte contre lui pour infraction grave à la loi fédérale sur les stupéfiants. Par ordonnance du 16 janvier 2009, le Juge d'instruction du canton de Vaud (ci-après: le juge d'instruction) a rejeté la requête de mise en liberté provisoire présentée la veille par A._. Une deuxième requête de mise en liberté a été rejetée par ordonnance du 18 mars 2009. Le recours formé par l'intéressé contre cette ordonnance auprès du Tribunal d'accusation du Tribunal cantonal du canton de Vaud (ci-après: le Tribunal cantonal) a été rejeté par arrêt du 3 avril 2009. Le 18 juin 2009, A._ a présenté une nouvelle demande de mise en liberté, que le juge d'instruction a rejetée par ordonnance du 19 juin 2009. Le prénommé a contesté cette ordonnance auprès du Tribunal cantonal, qui a rejeté son recours par arrêt du 2 juillet 2009. Cette autorité a considéré qu'il existait des présomptions de culpabilité suffisantes à l'encontre de A._ et que son maintien en détention était justifié par des risques de fuite, de récidive et de collusion. De plus, le principe de la proportionnalité demeurait respecté. B. Agissant par la voie du recours en matière pénale, A._ demande principalement au Tribunal fédéral d'ordonner sa libération immédiate et, subsidiairement, d'annuler l'arrêt attaqué et de renvoyer la cause au Tribunal cantonal pour nouvelle décision dans le sens des considérants. Il requiert en outre l'assistance judiciaire. Le Procureur général du canton de Vaud et le Tribunal cantonal ont renoncé à se déterminer. 