2010-09-02 5 views
1

J'ai essayé d'obtenir une réponse à ce que je fais de mal partout. Je voudrais que l'utilisateur sélectionne un bouton dans la classe appelante, ouvre un listactivity appelé qui affiche le contenu d'une base de données, laisse l'utilisateur cliquer sur une entrée, copie cette entrée dans une nouvelle base de données, renvoie le rowid de la nouvelle base de données la classe appelante et que la classe appelante attribue le titre de la nouvelle entrée de la base de données au bouton d'origine qui a été poussé.Base de données Quandry

Voici la classe d'appel

static final private int CHOOSE_MONDAY = 0; 
static final private int CHOOSE_TUESDAY = 0; 
private int ButtonPushed = 0; 
private NotesDbAdapter mDbHelper; 
private MenuDbAdapter menuDbHelper; 
private Long mRowId; 
String menuTitle; 
String menuProtein; 
String menuBody; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.plan_menu); 

    Toast.makeText(this, "Choose a day to pick a meal for!", Toast.LENGTH_LONG).show(); 
    mDbHelper = new NotesDbAdapter(this); 
    mDbHelper.open(); 
    menuDbHelper = new MenuDbAdapter(this); 
    menuDbHelper.open(); 



} 

public void mButtonHandler(View target) 
{ 
    switch(target.getId()) 
    { 
    case R.id.monday: 
     // Create new intent object and tell it to call the ColorPicker class 
     Intent question = new Intent(this, PlanMenuList.class); 
     // Start ColorPicker as a new activity and wait for the result 
     startActivityForResult(question, CHOOSE_MONDAY); 
     break; 
    case R.id.tuesday: 
     // Create new intent object and tell it to call the ColorPicker class 
     Intent question1 = new Intent(this, PlanMenuList.class);  
     // Start ColorPicker as a new activity and wait for the result 
     startActivityForResult(question1, CHOOSE_TUESDAY); 
     break; 
    } 

Et puis c'est la classe appelée où je suis en train de copier dans la sélection de l'utilisateur à la nouvelle base de données, puis renvoyer l'identifiant à la classe d'appel.

public class PlanMenuList extends ListActivity { 

private NotesDbAdapter mDbHelper; 
private MenuDbAdapter menuDbHelper; 
private List<Data>data; 
String menuTitle; 
String menuProtein; 
String menuBody; 
private Long mRowId; 




/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.notes_list); 
    mDbHelper = new NotesDbAdapter(this); 
    menuDbHelper = new MenuDbAdapter(this); 
    mDbHelper.open(); 
    menuDbHelper.open(); 
    fillData(); 
} 

private void fillData() { 
    Cursor notesCursor = mDbHelper.fetchAllNotes(); 
    startManagingCursor(notesCursor); 

    // Create an array to specify the fields we want to display in the list (only TITLE) 
    String[] from = new String[]{NotesDbAdapter.KEY_TITLE}; 

    // and an array of the fields we want to bind those fields to (in this case just text1) 
    int[] to = new int[]{R.id.text1}; 

    // Now create a simple cursor adapter and set it to display 
    SimpleCursorAdapter notes = 
      new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to); 
    setListAdapter(notes); 

} 

private void populateFields() { 
    if (mRowId != null) { 
     Cursor note = mDbHelper.fetchNote(mRowId); 
     startManagingCursor(note); 
     menuTitle=(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE))); 
     menuProtein=(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_PROTEIN))); 
     menuBody=(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY))); 
    } 
} 





protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    mDbHelper.fetchNote(id); 
    mRowId = id; 
    //populateFields(); 
    menuDbHelper.createMenu("Monday", menuTitle, menuProtein, menuBody); 
    Intent answer = new Intent(); 
    answer.putExtra("MenuDbAdapter.KEY_ROWID", mRowId); 
    setResult(RESULT_OK, answer); 
    finish(); 



} 
} 

J'ai été déconner avec cette chose pendant des jours et ne peut pas sembler obtenir à faire ce que je veux - toute aide serait appréciée.

Répondre

0

Pouvez-vous publier votre implémentation onActivityResult? Lorsque j'ai renvoyé des données à une activité, j'ai utilisé les ensembles. Par exemple:

Intent answer = new Intent(); 
Bundle extras = new Bundle(); 
extras.putLong("MenuDbAdapter.KEY_ROWID", mRowId); 
answer.putExtras(extras); 

Ensuite, dans le gestionnaire de résultat d'activité, vous appelleriez Intent.getExtras et tirez votre valeur à partir de là.

Edit: voici quelques exemples du guide dev Android: http://developer.android.com/guide/appendix/faq/commontasks.html (recherche onActivityResult) http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html

+1

Merci beaucoup pour votre aide, je l'apprécie. Je n'ai pas réalisé que getExtra et getExtras étaient deux choses totalement différentes ... peut-être acheter un livre n'est pas une si mauvaise idée. – Will

+0

Pas de problème. Vous pouvez également regarder le code pour les applications de base Android sur Google Code. rendez-vous sur www.google.com/codesearch et effectuez une recherche, par exemple: 'package de calendrier:" git: //android.git.kernel.org "lang: java' –

0
protected void onListItemClick(ListView l, View v, int position, long id) { 

la variable id est pas le même que le numéro de ligne de base de données et c'est où le problème est . Je créer un adaptateur personnalisé et stocker le _id (numéro de ligne) comme une balise dans la vue. Récupérez la balise dans OnItemClickListener et effectuez les requêtes db.

Code adaptateur personnalisé: classe privée Cursy étend CursorAdapter {

public Cursy(Context context, Cursor c) { 
     super(context, c); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     viewHolder holder = (viewHolder) view.getTag(); 

     holder.tv.setText(cursor.getString(cursor 
       .getColumnIndex(NotesDbAdapter.KEY_TITLE))); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 

     viewHolder holder = new viewHolder(); 
     holder._id = ursor.getString(cursor.getColumnIndex(NotesDbAdapter._ID)); 

     View v = getLayoutInflater().inflate(
       R.layout.list_layout, null); 

     holder.tv = (TextView) v 
       .findViewById(R.id.tv); 

     v.setTag(holder); 
     return v; 
    } 

} 

OnItemClickListener:

mListView.setOnItemClickListener (nouveau OnItemClickListener() {

 @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      viewHolder holder = (viewHolder) view.getTag(); 

      // use holder._id and do the db queries 
     } 
    }); 
+0

Cela m'a échappé, je n'ai pas regardé ce que "Tags" sont.Je vous remercie pour la réponse, je l'apprécie et ajouterai votre réponse à ma liste de «choses à regarder et essayer de faire le tour». :) – Will

0

Tout d'abord, je pense que vous voulez pour vous assurer que vos constantes CHOOSE_MONDAY et CHOOSE_TUESDAY sont différentes valeurs, de sorte que vous pouvez n différencier entre eux plus tard.

Deuxièmement, vous renvoyez le mauvais identifiant de ligne à votre activité d'origine. En supposant que votre méthode createMenu() est basée sur SQLiteDatabase.insert(), il devrait retourner l'ID de la ligne après l'insertion (ou -1 s'il y avait un problème). Vous pouvez l'utiliser comme ID de ligne:

mRowId = menuDbHelper.createMenu("Monday", menuTitle, menuProtein, menuBody);