2011-05-30 5 views
1

J'ai une activité qui montre 3 images aléatoires de données JSON sur le Web. Chaque image aléatoire est cliquable et conduit à son activité de détails, portant son titre, son image, sa description, etc. Les images montrées sont distinctes les unes des autres.Problèmes implémentant SQLite et Cursor dans une activité

J'ai besoin d'implémenter SQLite et un Cursor à cette activité afin que chaque fois qu'il n'y a pas de connexion Internet, l'application lit les données d'image du cache sur le stockage externe. J'ai déjà les classes de la base de données, fournisseur et synchronisation. J'ai une base de données SQLite avec les colonnes suivantes:

  • BaseColumns._ID
  • Database.Project.C_SMALLIMAGE

Voici les extraits de code que j'ai jusqu'à présent:

void doSync() { 
    Intent serviceIntent = new Intent(this, LooserSync.class); 
    startService(serviceIntent); 
} 

Cette méthode appelle la Service Web où je mets mon URL. Ceci est l'image est chargée:

public void setViewImage(ImageView v, String value) { 
    v.setTag(value); 
    loader.DisplayImage(value, context, v); 
} 

Ceci est mon ancienne fonction qui randomise les images et les rend cliquables:

prjcts = new ArrayList<Project>(); 
int max = prjcts.size(); 
System.out.println(max); 
List<Integer> indices = new ArrayList<Integer>(max); 
for(int c = 1; c < max; ++c) { 
    indices.add(c); 
} 
Random r = new Random(); 
int arrIndex = r.nextInt(indices.size()); 
int randomIndex1 = indices.get(arrIndex); 
indices.remove(arrIndex); 

C'est ce que j'ai dans mon activité jusqu'à présent:

int arrIndex2 = r.nextInt(indices.size()); 
int randomIndex2 = indices.get(arrIndex2); 
indices.remove(arrIndex2); 

int arrIndex3 = r.nextInt(indices.size()); 
int randomIndex3 = indices.get(arrIndex3); 
indices.remove(arrIndex3); 

imageLazy(image1, prjcts.get(randomIndex1),Main.this); 
imageLazy(image2, prjcts.get(randomIndex2),Main.this); 
imageLazy(image3, prjcts.get(randomIndex3),Main.this); 

image1.setOnClickListener(new RandomClickListener(randomIndex1)); 
image2.setOnClickListener(new RandomClickListener(randomIndex2)); 
image3.setOnClickListener(new RandomClickListener(randomIndex3)); 

public void imageLazy(final ImageView image,Project pro,Activity activity) { 
    String imageurl = pro.smallImageUrl; 
    image.setTag(imageurl); 
    loader.DisplayImage(imageurl, activity,image); 
} 

public class RandomClickListener implements View.OnClickListener { 
    private final int randomIndex; 

    public RandomClickListener(final int randomIndex) { 
      this.randomIndex = randomIndex; 
    } 
    @Override 
    public void onClick(View v) { 
      Intent top = new Intent(Main.this, DetailsActivity.class); 
      top.putExtra("spendino.de.ProjectDetail.position", randomIndex); 
      /* 
      top.setData(Uri.withAppendedPath(Uri.withAppendedPath(
      LooserProvider.CONTENT_URI, Database.Project.NAME), Long.toString(id))); 
      */ 
      startActivity(top); 
    } 
} 

Voici une fonction qui récupère les détails de l'image:

Uri uri = Uri.withAppendedPath(Uri.withAppendedPath(LooserProvider.CONTENT_URI, Database.Project.NAME), Long .toString(id)); 

Cursor managedCursor = managedQuery(uri, new String[] { BaseColumns._ID, Database.Project.C_BIGIMAGE }, null, null, "RANDOM() LIMIT 3"); 

Des suggestions sur la façon de générer le code à partir de ces extraits?

Répondre

2

pour une utilisation de saké FSM de ListView avec requête comme ceci

Cursor managedCursor = managedQuery(//it seems like you should change your internship 
       uri, //to somthing esier than programming 
       projection, // Which columns to return. 
       null,   // WHERE clause. 
       null,   // WHERE clause value substitution 
       "RANDOM() LIMIT 3"); 

avec cette requête u get top 3 lignes de la table de projet dans un ordre aléatoire

EDIT:

  1. utilisation ListView
  2. mauvais uri ... vous n'avez pas fait vos devoirs (en lisant this). Essaye celui-là. Uri uri = Uri.withAppendedPath(LooserProvider.CONTENT_URI, Database.Project.NAME));
  3. de l'utilisation de curseurs:

    curseur c = requête();

    si (c.moveToFirst()) {

    do{ 
    
        //do something with current row like c.getString(1); 
    
    }while(c.moveToNext()); 
    

    }

  4. mais pourquoi oh pourquoi vous n'utilisant ListView

EDIT2: chang lignes similaires à my sample for looser:

listView.setAdapter(new MySimpleCursorAdapter(this, R.layout.itemrow, 
      managedQuery(Uri.withAppendedPath(LooserProvider.CONTENT_URI, 
        Database.Project.NAME), new String[] { BaseColumns._ID, 
        Database.Project.C_PROJECTTITLE, 
        Database.Project.C_ORGANIZATIONTITLE, 
        Database.Project.C_SMALLIMAGE }, null, null, "RANDOM() LIMIT 3"), 
      new String[] { Database.Project.C_PROJECTTITLE, 
        Database.Project.C_ORGANIZATIONTITLE, 
        Database.Project.C_SMALLIMAGE }, new int[] { 
        R.id.tName, R.id.tDescription, R.id.iItem })); 

vous pouvez faire Menu-> Synchroniser pour voir ce qui se passe

se débarrasser du texte de listrow et vous avez votre programme

+0

alors j'ai essayé quelque chose, vous pouvez rechercher ma question mise à jour ... qu'est-ce que j'ai besoin de plus? – hectichavana

+0

Merci, je vais essayer. Je n'utilise pas listview parce que je dois l'afficher pas comme une liste, j'ai seulement besoin d'afficher 3 images et il doit être horizontal – hectichavana

+0

en utilisant l'EDIT2 est en fait une idée intelligente, et maintenant j'essaie de comprendre comment la liste La vue pourrait être horizontale. Et le plus important, quand je clique sur la liste au hasard, il devrait me conduire à son détails détails, pas les détails basés sur la position d'entrée sur le json – hectichavana

1

Je pense que vous devriez poser une question relativement simple à répondre. La plupart des gens ne voudront pas produire de code pour vous.

+1

Vous devriez écrire ceci comme commentaire au lieu de l'écrire comme réponses – ingsaurabh

Questions connexes