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.

Considérant en droit:
1. Les décisions relatives au maintien en détention avant jugement sont des décisions en matière pénale au sens de l'<ref-law> (cf. <ref-ruling> consid. 1.1 p. 273; Message concernant la révision totale de l'organisation judiciaire fédérale du 28 février 2001, FF 2001 p. 4111). Formé en temps utile (<ref-law>) contre une décision prise en dernière instance cantonale (<ref-law>) et qui touche le recourant dans ses intérêts juridiquement protégés (art. 81 al. 1 let. a et b ch. 1 LTF), le recours est recevable.
2. Une mesure de détention préventive n'est compatible avec la liberté personnelle, garantie par les art. 10 al. 2 Cst. et 5 CEDH, que si elle repose sur une base légale (art. 31 al. 1 et 36 al. 1 Cst.), soit en l'espèce l'art. 59 du Code de procédure pénale du canton de Vaud du 12 septembre 1967 (CPP/VD; RSV 312.01). Elle doit en outre correspondre à un intérêt public et respecter le principe de la proportionnalité (art. 36 al. 2 et 3 Cst.; <ref-ruling> consid. 2c p. 270). Pour que tel soit le cas, la privation de liberté doit être justifiée par un danger pour la sécurité ou l'ordre public, par un risque de fuite ou par les besoins de l'instruction (cf. art. 59 ch. 1 à 3 CPP/VD). La gravité de l'infraction - et l'importance de la peine encourue - n'est, à elle seule, pas suffisante (<ref-ruling> consid. 3a p. 62; <ref-ruling> consid. 4a). Préalablement à ces conditions, il doit exister à l'égard de l'intéressé des charges suffisantes, soit de sérieux soupçons de culpabilité (art. 5 par. 1 let. c CEDH; <ref-ruling> consid. 3; art. 59 in initio CPP/VD). S'agissant d'une restriction grave à la liberté personnelle, le Tribunal fédéral examine librement ces questions, sous réserve toutefois de l'appréciation des preuves, revue sous l'angle restreint de l'arbitraire (<ref-ruling> consid. 2d p. 271). L'autorité cantonale dispose ainsi d'une grande liberté dans l'appréciation des faits (<ref-ruling> consid. 3; <ref-ruling> consid. 3b).
3. Le recourant ne remet pas en cause l'existence de charges suffisantes, mais il conteste notamment l'existence d'un risque de collusion.
3.1 Le maintien du prévenu en détention peut être justifié par l'intérêt public lié aux besoins de l'instruction en cours, par exemple lorsqu'il est à craindre que l'intéressé ne mette sa liberté à profit pour faire disparaître ou altérer les preuves, ou qu'il prenne contact avec des témoins ou d'autres prévenus pour tenter d'influencer leurs déclarations. On ne saurait toutefois se contenter d'un risque de collusion abstrait, car ce risque est inhérent à toute procédure pénale en cours et doit, pour permettre à lui seul le maintien en détention préventive, présenter une certaine vraisemblance. L'autorité doit ainsi démontrer que les circonstances particulières de l'espèce font apparaître un danger concret et sérieux de telles manoeuvres, propres à entraver la manifestation de la vérité, en indiquant, au moins dans les grandes lignes et sous réserve des opérations à conserver secrètes, quels actes d'instruction elle doit encore effectuer et en quoi la libération du prévenu en compromettrait l'accomplissement (<ref-ruling> consid. 2.1 p. 151; <ref-ruling> consid. 3c p. 35; <ref-ruling> consid. 4b-c p. 260 s. et les références). Si le danger de collusion est en règle générale plus important au début d'une procédure pénale (<ref-ruling> consid. 4g p. 144), il peut toutefois subsister après la clôture de l'enquête lorsque les circonstances font sérieusement craindre que le prévenu n'abuse de sa liberté pour empêcher ou altérer la manifestation de la vérité devant l'autorité de jugement, voire de recours (ATF <ref-ruling> consid. 4b p. 261; Gérard Piquerez, Traité de procédure pénale suisse, 2e éd., 2006, n. 849 p. 543).
3.2 En l'espèce, le Tribunal cantonal a considéré qu'il restait des investigations à effectuer et qu'il n'était pas exclu que le recourant entre en contact avec ceux qui pourraient le mettre en cause, pour tenter d'influencer leurs déclarations en sa faveur. Il mentionne notamment des tiers qui font l'objet d'enquêtes dans le canton de Neuchâtel et avec lesquels le recourant était en relation. Il évoque aussi des investigations en cours contre "les membres de la filière demeurant au Kosovo". Il relève également que le recourant avait communiqué, au moyen d'un téléphone portable trouvé en sa possession en prison, avec son frère, qui le met en cause, et sa belle-soeur. Ces derniers devaient encore être entendus au sujet de ces communications. Le recourant ne conteste pas ces éléments et il ne remet pas en question l'appréciation du Tribunal cantonal de manière convaincante. Il se borne en effet à affirmer que "les enquêteurs ont annoncé, il y a plus d'un mois, la clôture de l'enquête", sans aucunement discuter les actes d'instructions susmentionnés. Il ressort au demeurant du dossier que l'instruction n'était pas close lorsque l'arrêt attaqué a été rendu, des auditions ayant encore eu lieu les 24 et 27 juillet 2009. Le recourant peut donc être renvoyé à la motivation de l'arrêt querellé s'agissant du risque de collusion, qui apparaît à ce stade concret et vraisemblable au regard des motifs invoqués.
4. Dès lors que le maintien en détention du recourant est encore justifié par un danger de collusion, il n'est pas nécessaire d'examiner s'il peut aussi être motivé par un risque de fuite ou par un risque de récidive, comme le retient la décision attaquée.
5. Il reste à examiner si la détention litigieuse viole les principes de la proportionnalité et de la célérité, comme le soutient le recourant.
5.1 En vertu des art. 31 al. 3 Cst. et 5 par. 3 CEDH, toute personne qui est mise en détention préventive a le droit d'être jugée dans un délai raisonnable ou d'être libérée pendant la procédure pénale. Une durée excessive de la détention constitue une limitation disproportionnée de ce droit fondamental, qui est notamment violé lorsque la durée de la détention préventive dépasse la durée probable de la peine privative de liberté à laquelle il faut s'attendre. Dans l'examen de la proportionnalité de la durée de la détention, il y a lieu de prendre en compte la gravité des infractions faisant l'objet de l'instruction. Le juge peut maintenir la détention préventive aussi longtemps qu'elle n'est pas très proche de la durée de la peine privative de liberté à laquelle il faut s'attendre concrètement en cas de condamnation (<ref-ruling> consid. 4.1 p. 170; <ref-ruling> consid. 4.1 p. 27; <ref-ruling> consid. 2.2 p. 151; <ref-ruling> consid. 2 et 3 p. 257 ss et les références). L'incarcération peut aussi être disproportionnée en cas de retard injustifié dans le cours de la procédure pénale. Il doit toutefois s'agir d'un manquement particulièrement grave, faisant au surplus apparaître que l'autorité de poursuite n'est plus en mesure de conduire la procédure à chef dans un délai raisonnable (<ref-ruling> consid. 3.4.2 p. 281; <ref-ruling> consid. 2.2.1 p. 151 s.; <ref-ruling> consid. 3a p. 273; <ref-ruling> consid. 5a, 107 Ia 257 consid. 2 et 3).
5.2 En l'occurrence, le recourant se limite à rappeler la jurisprudence et à affirmer que l'enquête est close et que l'intérêt public pourrait être préservé par une mesure moins dommageable que la détention préventive. Il est dès lors douteux que le grief soit recevable au regard des exigences minimales de motivation déduites des art. 42 al. 2 et 106 al. 2 LTF (cf. à cet égard <ref-ruling> consid. 1.4 p. 254 s. et les références). Au demeurant, compte tenu des graves accusations pesant sur le recourant, les quelque huit mois de détention préventive subis à ce jour apparaissent encore compatibles avec la peine privative de liberté à laquelle l'intéressé est exposé concrètement en cas de condamnation. De plus, on ne voit pas quelle mesure moins incisive que la détention préventive permettrait de prévenir le risque de collusion, les mesures alternatives évoquées par le recourant ayant du reste trait au risque de fuite uniquement. Enfin, la procédure progresse régulièrement et on ne distingue pas de graves manquements à cet égard.
6. Il s'ensuit que le recours de droit public doit être rejeté, dans la mesure de sa recevabilité. Dès lors que le recourant est dans le besoin et que ses conclusions ne paraissaient pas d'emblée vouées à l'échec, l'assistance judiciaire doit lui être accordée (<ref-law>). Le recourant requiert la désignation de Me Antoine Eigenmann en qualité d'avocat d'office. Il y a lieu de donner droit à cette requête et de fixer d'office les honoraires de l'avocat, qui seront supportés par la caisse du Tribunal fédéral (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté, dans la mesure où il est recevable.
2. La demande d'assistance judiciaire est admise.
3. Il n'est pas perçu de frais judiciaires.
4. Me Antoine Eigenmann avocat à Lausanne, est désigné comme avocat d'office du recourant et ses honoraires, supportés par la caisse du Tribunal fédéral, sont fixés à 1'500 fr.
5. Le présent arrêt est communiqué au mandataire du recourant, au Procureur général et au Tribunal d'accusation du Tribunal cantonal du can ton de Vaud.
Lausanne, le 24 août 2009
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le Président: Le Greffier:
Féraud Rittener