2012-07-15 3 views
3

J'ai un fichier de classe appelé MarkerCustom. MarkerCustom a un constructeur qui prend trois variables de types différents.Comment créer une liste d'objets en Java

public MarkerCustom(int myInt, String, myString, BitmapData myBitmap) { 

De ma principale activité principale je veux charger une vue GLSurface qui prendra une ArrayList de chaque instance de MarkerCustom que je vais vouloir charger dans le GLSurface ainsi que les données qui seront transmises dans chaque instance de Le constructeur de MarkerCustom.

Appelons la liste de groupes myMarkers;

i besoin myMarkers ressembler à ceci:

myMarkers[0] = [1, "hello", bitMapData1] 
myMarkers[1] = [66, "johnHandy", bitmapData2] 

je suis assez nouveau pour Java et son casting ect me confond un peu étant venu de AS3

EDIT

Ainsi suivant La réponse d'AKhill ci-dessous j'ai édité mon GLSurfaceView pour accepter une ArrayList comme montré ci-dessous. Mais la MarkerCustom classe doit être créée à partir de chaque figurant dans cette liste de tableaux dans le constructeur d'une manière que son est accessible dans le onSurfaceCreate et la méthode du GLSurfaceView

S'il vous plaît voir les méthodes et les pour les boucles/commentaires dans ce classe ci-dessous:

public class GLLayer extends GLSurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback, Renderer { 

    private Context context; 

    ArrayList <MarkerCustom> locationTags; 

    private PhoneOrientation phoneOri; 


    public GLLayer(Context context, int orientation, ArrayList<MarkerCustom> custMarkers) { 
     super(context); 
     locationTags = custMarkers; 

     this.context = context; 

     phoneOri=new PhoneOrientation(context); // sensor manager and interpreter 

     for(int i =0; i<locationTags.size(); i++){ 

      //Need to create a an instance of each MarkerCustom 
      // something like MarkerCustom locationTags[i]; = new MarkerCustom (its params); 
     } 
     this.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 

     this.setRenderer(this); 
     phoneOri.start(context, orientation); 

    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     gl.glEnable(GL10.GL_TEXTURE_2D); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     gl.glLoadIdentity(); 

     GLU.gluLookAt(gl,0, 0, 0, 0, 0, 0, 0, 0, 0); 

     float floatMat[]=phoneOri.getMatrix(); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 


     gl.glLoadMatrixf(floatMat, 0); 


     for(int i=0;i<loacationTags.size();i++){ 
      gl.glPushMatrix(); 

      //locationTags[i].draw(gl); 
      gl.glLoadMatrixf(floatMat,0); 
     } 


     gl.glPushMatrix(); 

    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     if(height == 0) {      
     height = 1;       
     } 
     float ratio = (float) width/height; 
     gl.glViewport(0, 0, width, height);  
     gl.glMatrixMode(GL10.GL_PROJECTION);  
     gl.glLoadIdentity();      

     GLU.gluPerspective(gl, 35.0f, (float)width/(float)height, 5.0f, 200.0f); 
     gl.glMatrixMode(GL10.GL_MODELVIEW);  
     gl.glLoadIdentity();      

     GLU.gluLookAt(gl, 0, 1.0f, 5.0f, 0, 0, 0, 0, 1.0f, 0); 


    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { 

     for(int i=0;i<locationTags.size();i++){ 
      //call each MarkerCustom's loadGLTexture Method 
       //locationTags[i].loadGLTexture(gl, this.context); 
     } 


     gl.glEnable(GL10.GL_TEXTURE_2D);    
     gl.glShadeModel(GL10.GL_SMOOTH);    
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
     gl.glClearDepthf(1.0f);      
     gl.glEnable(GL10.GL_DEPTH_TEST);   
     gl.glDepthFunc(GL10.GL_LEQUAL);    


     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_SMOOTH); 

    } 

    @Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 


    } 


} 

Et Juste pour référence ici est ma MarkerCustom classe

public class MarkerCustom { 

    public float xPos; 
    public float yPos; 
    public float zPos; 
    public float yaw; 
    public float pitch; 
    public Bitmap tagImage; 

    private FloatBuffer vertexBuffer; // buffer holding the vertices 
    private float vertices[] = { 
      0.0f, -10.0f, -10.0f,  // V1 - bottom left 
      0.0f, -10.0f, 10.0f,  // V2 - top left 
      0.0f, 10.0f, -10.0f,  // V3 - bottom right 
      0.0f, 10.0f, 10.0f   // V4 - top right 

    }; 

    private FloatBuffer textureBuffer; // buffer holding the texture coordinates 
    private float texture[] = { 
      // Mapping coordinates for the vertices 
      0.0f, 1.0f,  // top left  (V2) 
      0.0f, 0.0f,  // bottom left (V1) 
      1.0f, 1.0f,  // top right (V4) 
      1.0f, 0.0f  // bottom right (V3) 

    }; 


    public MarkerCustom(float x, float y, float z, float yawAngle, float pitchAngle, Bitmap bitmap) { 

     xPos = x; 
     yPos = y; 
     zPos = z; 
     yaw = yawAngle; 
     pitch = pitchAngle; 
     tagImage = bitmap; 

     ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     vertexBuffer = byteBuffer.asFloatBuffer(); 
     vertexBuffer.put(vertices); 
     vertexBuffer.position(0); 

     byteBuffer = ByteBuffer.allocateDirect(texture.length * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     textureBuffer = byteBuffer.asFloatBuffer(); 
     textureBuffer.put(texture); 
     textureBuffer.position(0); 

    } 
    /** The texture pointer */ 
    private int[] textures = new int[1]; 

    public void loadGLTexture(GL10 gl, Context context) { 
     // loading texture 
     // Enable blending using premultiplied alpha. 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 



     // generate one texture pointer 
     gl.glGenTextures(1, textures, 0); 
     // ...and bind it to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

     // create nearest filtered texture 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

     // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, tagImage, 0); 

     // Clean up 
     tagImage.recycle(); 
    } 
    public void draw(GL10 gl) { 
     // bind the previously generated texture 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

     // Point to our buffers 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

     // Set the face rotation 
     gl.glFrontFace(GL10.GL_CW); 

     // Point to our vertex buffer 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

     // Draw the vertices as triangle strip 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

     //Disable the client state before leaving 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    } 

} 

Répondre

18

Essayez ceci.

List<MarkerCustom> myList=new ArrayList<MarkerCustom>(); 
MarkerCustom entry1=new MarkerCustom(myInt, myString, myBitmap); 
MarkerCustom entry2=new MarkerCustom(myInt, myString, myBitmap); 

myList.add(entry1); 
myList.add(entry2); 
+0

problème est la quantité de marqueurs n'est pas prédéterminée, ce serait une liste à partir d'une requête de base de données .. cela fonctionnerait-il? pour (int i = 0; i erik

+0

oui ça va marcher. –

+0

merci ... désolé pour ma mise en forme .. je ne sais pas comment faire des blocs de code dans les commentaires .. juste pour être clair, je peux dire des résultats [i] [0]? – erik

4

sténographie:

List<MarkerCustom> markerList= Arrays.asList(
    new MarkerCustom(1, "hello", bitMapData1), 
    new MarkerCustom(66, "johnHandy", bitMapData2)); 
} 
+0

À noter que cette liste aurait une taille fixe. – assylias

+0

ok je pense que c'est sur le bon chemin .. mais ce travail si je devais obtenir une liste de données de ligne, puis dire quelque chose comme: pour (int i = 0; i erik

+0

Lorsque cette liste est corrigée, la méthode add n'est pas disponible. Par conséquent, vous devrez utiliser l'approche indiquée ci-dessus par Akhil Dev. – Reimeus

0

Dans ce cas, je pense qu'il est plus facile de créer un marqueur de classe (par exemple) qui a trois attributs. Par exemple:

class Marker { 

int var1; 
String var2; 
BitmapData var3; } 

De cette façon, vous êtes en mesure de stocker une liste de tableaux de marqueurs (ArrayList), et vous pouvez accéder à toutes les informations dont vous avez besoin.

Questions connexes