2017-12-24 1 views
0

Ich habe 3 ListView in Fragment und jetzt muss ich das Objekt, das ich geklickt habe, um eine neue Seite zu öffnen und einige Elemente anzeigen.ein Element in einem ListView bekommen

Das Problem ist, dass in meiner Tabs die ListView mit einer Sqlite db gefüllt ist und wenn ich Element zur Liste hinzufügen beginnt jede Seite von 0, während in meiner DB jedes Element eine andere ID hat.

Wie kann ich das richtige Element bekommen?

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 

      Integer pageToShow = getArguments().getInt(ARG_SECTION_NUMBER); 

      View rootView = inflater.inflate(R.layout.fragment_choose_character, container, false); 
      ListView listView = (ListView) rootView.findViewById(R.id.listViewPersonaggi); 

      personaggiDB = new DatabasePersonaggiHandler(getContext()); 
      ArrayList<Personaggio> personaggi = personaggiDB.getAllPersonaggi(pageToShow); 

      // Adatto il personaggio alla grafica della lista 
      this.m_adapter = new PersonaggioAdapter(getContext(), R.layout.riga_personaggio, personaggi); 
      listView.setAdapter(this.m_adapter); 

      // Su ogni elemento della lista aggiungo il click 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

        Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
        singoloPersonaggioIntent.putExtra("idPersonaggio", i); 
        startActivity(singoloPersonaggioIntent); 
       } 
      }); 

      return rootView; 
     } 

Wie man sehen kann ich diese Zeile verwenden:

ArrayList<Personaggio> personaggi = personaggiDB.getAllPersonaggi(pageToShow); 

zu verstehen, welche Art von Zeichen aus meiner DB erhält so jede Seite verschiedene Charaktere hat.
Zum Beispiel in meiner zweiten Registerkarte pageToShow = 2 hat das erste Element die Position 0, aber in meiner DB hat es id = 12 und so weiter.

Irgendeine Idee?

+1

Dies kann Ihnen helfen. https://stackoverflow.com/questions/3041218/assigning-id-to-a-row-in-an-android-listview – lib4

Antwort

0

Es gibt drei Möglichkeiten, Daten beim Klicken auf Listenelemente zu übergeben.

1. Zuerst, wenn Sie die kompletten Daten auf der nächsten Seite laden, dann sollten Sie die PrimaryKey passieren, die Id zum nächsten Bildschirm. Dazu müssen Sie das Listenelement vom Adapter abrufen. Im Adapter

@Override 
    public Personaggio getItem(int position) { 
     return list.get(position); 
    } 

Dann die Instanz für das angeklickte Element abrufen.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 
       Personaggio obj=m_adapter.getItem(position); 
       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("idPersonaggio", obj.getId()); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 

2. Im zweiten Fall können Sie direkt das Objekt zur nächsten Aktivität übergeben.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 
       Personaggio obj=m_adapter.getItem(position); 
       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("data", obj); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 

In diesem Fall sollte Ihre Modellklasse Serializable implementieren.

class Personaggio implements Serializable{ 

    } 

3. Für eine CursorAdapter (und folglich eine SimpleCursorAdapter) die ID der Zeilennummer der Tabelle zurückgibt, das heißt, _id. Wenn Sie also CursorAdapter verwenden, können Sie einfach den 4. langen Pamameter verwenden und er sollte _id heißen.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 

       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("idPersonaggio", l); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 
+0

Danke, ich habe Ihren zweiten Vorschlag verwendet und es funktioniert wie ein Charme! –

Verwandte Themen