2017-12-28 18 views
0

Wenn ich meine listview mit dem Primärschlüssel meiner Tabelle befüllen kann ich diesen Primärschlüssel mit getItemAtPosition und dann funktioniert es gut.Erhalten Primärschlüssel beim Klicken auf einen Artikel auf Listenansicht

Das Problem ist, dass ich die primarykey nicht verwenden möchte, um de listview zu füllen, stattdessen möchte ich andere Felder meiner Tabelle verwenden. Wenn ich den getItemAtPosition-Befehl verwende, kann ich das nicht verwenden, um mein Register auszuwählen.

Ich dachte über die Verwendung getItemIdAtPosition, aber ich habe keine Lösung erreicht.

public void populateListView() { 
     //get the data and append to the list 
     Cursor data = db.getAllDataFillup(selectedID); 
     ArrayList<String> listData2 = new ArrayList<>(); 


     while (data.moveToNext()) { 
      //listData2.add("FILLUP_ID: " + data.getString(0) + " FILLUP_VEHICLE_ID: " + data.getString(1)); 
      //listData2.add(data.getString(7) + " " + data.getString(8) + " " + data.getString(2)); 
      listData2.add(data.getString(3)); 
      //listData2.add(data.getString(2)); 

     } 



     //create the list adapter and set the adapter 

     ListAdapter adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listData2); 
     list_fillup.setAdapter(adapter2); 


     //set onItemClickListener to the listView 
     list_fillup.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       int fillupID = Integer.parseInt(adapterView.getItemAtPosition(i).toString()); 

       long position = adapterView.getSelectedItemId(); 
       //long a = list_fillup.get(codigoDoObjeto).getCodigoIdOuPKQualquer(); 



       toastMessage("position: " + position); 
       //toastMessage("fillupPosition: " + fillupPosition); 
       //long fillupPosition = adapterView.getItemIdAtPosition(i); 

       Log.d(TAG, "onItemClick: You Clicked on " + fillupID); 


       Cursor data = db.getDataTableFillup(fillupID);//get the data associated with that fillupID 

       fillupID = -1; 
       while (data.moveToNext()) { 
        fillupID = data.getInt(0); 
        vehicleID = data.getInt(1); 
        fillupDate = data.getString(2); 
        odometer = data.getLong(3); 
        kmDriven = data.getLong(4); 
        liters = data.getLong(5); 
        consumption = data.getLong(6); 
        label = data.getString(7); 
        sequence = data.getInt(8); 
       } 
       if (fillupID > -1) { 
        Log.d(TAG, "onItemClick: The ID is: " + fillupID); 
        Intent screenVehicle = new Intent(Vehicle_painel.this, Fillup_edit.class); 
        screenVehicle.putExtra("fillupID", fillupID); 
        screenVehicle.putExtra("vehicleID", vehicleID); 
        screenVehicle.putExtra("vehicleName", selectedName); 
        screenVehicle.putExtra("date", fillupDate); 
        screenVehicle.putExtra("odometer", odometer); 
        screenVehicle.putExtra("kmDriven", kmDriven); 
        screenVehicle.putExtra("liters", liters); 
        screenVehicle.putExtra("consumption", consumption); 
        screenVehicle.putExtra("label", label); 
        screenVehicle.putExtra("sequence", sequence); 

        //toastMessage("fillupPosition: " + fillupPosition); 
        startActivity(screenVehicle); 

       } else { 
        toastMessage("fillupID = " + fillupID); 
        //db.deleteAllFillup(selectedID); 
        //toastMessage("No ID associated with that name hahaha"); 
       } 
+0

Haben Sie Liste ausgewählt Postion bekommen? – R2R

+0

Nicht die Position auf der Liste, sondern der Primärschlüssel aus meiner Tabelle. – GlauberBachi

Antwort

1

Am besten erstellen Sie eine benutzerdefinierte Klasse für Ihre Daten. Auf diese Weise erhalten Sie nicht mehr nur einen einfachen String Wert von Ihrem Adapter zurück. Ihre ArrayList wäre so etwas wie:

ArrayList<YourCustomClass> listData2 ... 

Erstellen Sie eine benutzerdefinierte Klasse „YourCustomClass“ (Nennen Sie es, was auch immer Sie mögen). Es könnte wie folgt aussehen:

public class YourCustomClass { 

    private long itemId = 0; 
    private String itemName; 
    private String itemDescription; 

    public YourCustomClass(){ 
    } 


    public void setItemId(long id){ this.itemId = id; } 
    public void setItemName(String itemName){ this.itemName = itemName; } 
    public void setItemDescription(String itemDescription){ this.itemDescription = itemDescription; } 

    public long getItemId() { return this.itemId; } 
    public String getItemName(){ return this.itemName; } 
    public String getItemDescription(){ return this.itemDescription; } 
} 

Jetzt in Ihrem onItemClick Methode, um die Id bekommen und die anderen Daten wie folgt aus:

YourCustomClass data = (YourCustomClass) adapterView.getItemAtPosition(i); 
long orderId = data.getItemId(); 
String name = data.getItemName(); 

Sie einen benutzerdefinierten Adapter benötigen ListView mit Daten zu füllen.

Sie können sich auch diese Antwort ansehen. Es zeigt, wie die Hintergrundfarbe eines ListView Elements geändert werden kann, zeigt aber auch mehr Details zum Implementieren eines benutzerdefinierten Adapters für Ihren ListView.

How to set background color for each item listview depanding on variable value

+0

Ich habe den Punkt, ich werde das versuchen. Vielen Dank! – GlauberBachi

Verwandte Themen