2012-04-05 13 views
2

Ich habe mich umgesehen, und es könnte sein, weil ich nicht sicher bin, was ich suche, aber ich kann nicht herausfinden, wie ich etwas tun soll, nehme ich an sollte mit Android ziemlich einfach sein.So wechseln Sie die Aktivität mit artikelspezifischen Daten gesendet

Ich habe eine Reihe von Daten auf dem Bildschirm anzuzeigen. Diese Daten sind eine Klasse, die einen Datenbankschlüssel, einen Namen und ein Bild enthält.

Ich zeige diese Daten derzeit als ImageView und TextView. Ich durchlaufe das Array und füge eine neue Zeile zu einem TableLayout hinzu, das das Bild und den Text enthält.

Ich möchte, dass sowohl das Bild als auch der Text anklickbar sind und zu einer neuen Aktivität wechseln.

Diese neue Aktivität muss den Datenbankschlüssel der Zeile kennen, auf die geklickt wurde, um die korrekten Daten anzuzeigen.

Hier ist, was ich bisher:

private void fillSuggestionTable(TableLayout tabSuggestions, Suggestion[] arrToAdd) 
{ 
    for(int i = 0; i < arrToAdd.length; i++) 
    { 
     /* Create a new row to be added. */ 
     TableRow trSuggestion = new TableRow(this); 
     trSuggestion.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 

     /* Create objects for the row-content. */ 
     ImageView imgDisplayPicture = new ImageView(this); 
     ImageHandler.loadBitmap(arrToAdd[i].strImageURL, imgDisplayPicture); 
     imgDisplayPicture.setLayoutParams(new LayoutParams(50,50)); 

     TextView txtArtistName = new TextView(this); 
     txtArtistName.setText(arrToAdd[i].strName); 
     txtArtistName.setTextColor(Color.parseColor("#000000")); 

     /* Add data to row. */ 
     trSuggestion.addView(imgDisplayPicture); 
     trSuggestion.addView(txtArtistName); 

     /* Add row to TableLayout. */ 
     tabSuggestions.addView(trSuggestion, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
    } 
} 

Antwort

1

Gibt es einen Grund, warum Sie ein TableView verwenden? es scheint, als ob, was Sie erreichen möchten, wäre viel einfacher mit einem ListView & benutzerdefinierte CursorAdapter, wo der Adapter kann die Übersetzung von der Datenbank in die ListView-Zeile. An diesem Punkt eine neue Tätigkeit beginnen, der die Datenbank-ID kennt, ist trivial:

mListView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) { 
    Intent i = new Intent(MyActivity.this, MyOtherActivity.class); 
    i.putExtra("database_id", id); 
    startActivity(i); 
    } 
}); 

Und in MyOtherActivity:

private int dbId; 
protected void onCreate(Bundle savedInstanceState) { 
    //do stuff 
    dbId = getIntent().getIntExtra("database_id", -1); // the -1 is the default if the extra can't be found 
} 
+0

Nein, der einzige Grund, warum ich Tableview verwende, war für mich damals am sinnvollsten. Ich vermute ID wäre die ID des Itme in der Liste? Wenn ich also die ListView fülle, solange ich die ID für das Listenelement auf den Datenbankschlüssel setze, kann ich die ID dann einfach abrufen? –

+0

Es ist sogar einfacher als das - erweitern Sie einfach CursorAdapter wie unten beschrieben, und wenn Sie Ihren Cursor von der Datenbank übergeben, vorausgesetzt, Sie benannten Ihre SQL-Spalten wie er will, legt er die ID-Eigenschaft jeder Ansicht in der ListView für Sie. http://droiddevelop.tumblr.com/post/12322798864/part-136-making-a-custom-cursor-adapter – JRaymond

1

Um zusätzliche Daten an eine andere Aktivität passieren, müssen Sie Methoden mit dem Intent.putExtra (name, value) zusätzliche Informationen hinzuzufügen.

Um zum Beispiel die Absicht zu senden:

Intent i = new Intent([pass info about next Activity here]); 
i.putExtra("databaseKey", databaseKey); 
startActivity(i); 

Um die Daten raus wieder:

public void onCreate(Bundle savedInstance) 
{ 
    // Do all initial setup here 

    Bundle extras = getIntent().getExtras(); 
    if (extras != null && extras.containsKey("databaseKey")) 
    { 
     int databaseKey = extras.getInt("databaseKey"); 
     // Load database info 
    } 
    else 
    { 
     // No data was passed, do something else 
    } 
} 

EDIT: Um herauszufinden, wann die Zeile der Tabelle geklickt wird, werden Sie brauchen, um Implementieren Sie View.OnClickListener, und legen Sie den OnClickListener für die von Ihnen verwendeten TableRows fest.

Zum Beispiel:

/* Create a new row to be added. */ 
TableRow trSuggestion = new TableRow(this); 
trSuggestion.setOnClickListener([listener]); 

Das einzige Problem, das Sie haben werden wird bezüglich einer ID-Ansicht auf die zugehörige Datenbank Zeilen-ID. Eine HashMap sollte helfen.

+0

Ich habe für das Bestehen Daten diese Methode gesehen. Das Problem, mit dem ich am meisten Probleme habe, ist, zu wissen, auf welches Objekt geklickt wurde, und die für dieses Objekt spezifischen Daten zu erhalten. –

+0

Ich habe meine Antwort mit Informationen über Hörer und so aktualisiert. – Raceimaztion

0

Dies ist ein ziemlich einfaches Verfahren. This blog erklärt es in einfachen Worten.

+0

Ich habe diese Methode zum Übergeben von Daten gesehen. Das Problem, mit dem ich am meisten Probleme habe, ist, zu wissen, auf welches Objekt geklickt wurde, und die für dieses Objekt spezifischen Daten zu erhalten. –

+0

Sie können Daten mit 'view.setTag (Object)' an eine Ansicht anhängen und sie dann mit 'view.getTag()' abrufen. –

Verwandte Themen