2010-11-10 6 views
2

J'essaye d'ajouter un bouton à chaque ligne sur un ListView. Le bouton copie alors la ligne (qui a été cliquée) de la table et insère la ligne dans une autre table. Ce que j'ai besoin de savoir, c'est comment assigner la ligne rowId cliquée à ma méthode de bouton car j'ai besoin de la passer à la méthode copyData. Voici mon code principal et la méthode du bouton est en bas.Passage rowId de ListView via un bouton

public class Favourites extends ListActivity { 
private static final int ACTIVITY_CREATE=0; 
private static final int ACTIVITY_EDIT=1; 

private static final int INSERT_ID = Menu.FIRST; 
private static final int DELETE_ID = Menu.FIRST + 1; 

private FavouritesDbAdapter mDbHelper; 



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

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

    // Create an array to specify the fields we want to display in the list 
    String[] from = new String[]{FavouritesDbAdapter.KEY_TITLE,FavouritesDbAdapter.KEY_ROWID}; 

    // and an array of the fields we want to bind those fields to 
    int[] to = new int[]{R.id.text1,R.id.text2}; 

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

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    menu.add(0, INSERT_ID, 0, R.string.menu_insert); 
    return true; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    switch(item.getItemId()) { 
     case INSERT_ID: 
      createNote(); 
      return true; 
    } 

    return super.onMenuItemSelected(featureId, item); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case DELETE_ID: 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
      mDbHelper.deleteNote(info.id); 
      fillData(); 
      return true; 
    } 
    return super.onContextItemSelected(item); 
} 

private void createNote() { 
    Intent i = new Intent(this, FavouritesEdit.class); 
    startActivityForResult(i, ACTIVITY_CREATE); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, Favourites.class); 
    Intent i1 = new Intent(this, FavouritesEdit.class); 
    i1.putExtra(FavouritesDbAdapter.KEY_ROWID, id); 
    i.putExtra(FavouritesDbAdapter.KEY_ROWID, id); 
    startActivityForResult(i1, ACTIVITY_EDIT); 

} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    fillData(); 
} 


public void button(View view) { 

    mDbHelper.copyData(#ROWID of CLICKED BUTTON TO BE PASSED OVER#); 
    fillData(); 

} 

}

+0

Il sera plus facile de définir simplement une variable locale avec l'identifiant de ligne sélectionné, n'est-ce pas? – ykatchou

+0

Je ne sais pas, d'où je demande :) – Sazzle

Répondre

0

Je l'ai fait quelque chose comme ça avant:

 ListView list_Builds = (ListView)findViewById(R.id.list_Builds); 
     list_Builds.setAdapter(adapter); 

     list_Builds.setOnItemClickListener(new OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView parent, View view, int position, long id) 
      { 
        // BuildID is my primary key in the table 

        TextView lbl_BuildID = (TextView)view.findViewById(R.id.lbl_BuildID); 
        String buildID = (String)lbl_BuildID.getText(); 

        TextView lbl_BuildName = (TextView)view.findViewById(R.id.lbl_BuildName); 
        String buildName = (String)lbl_BuildName.getText(); 

        TextView lbl_BuildDescription = (TextView)view.findViewById(R.id.lbl_BuildDescription); 
        String buildDescription = (String)lbl_BuildDescription.getText(); 

        // I passed it on to a new intent. But here you could call your database 
        Intent i = new Intent(getBaseContext(), ViewBuild.class); 

        i.putExtra("BuildID", buildID); 
        i.putExtra("BuildName", buildName); 
        i.putExtra("BuildDescription", buildDescription); 
        startActivity(i); 
       } 
       catch(Exception ex) 
       { 
        Log.println(1, "item-click-event", ex.getMessage()); 
       } 
      } 
     }); 

En fait, quand je lie à la vue de la liste, j'ai caché "BuildID" TextView qui contient l'ID de clé primaire de cette ligne de la base de données.

Questions connexes