2017-12-13 21 views
0

Grundsätzlich möchte ich Daten von Sqlite aus zwei verschiedenen Tabellen (oder Spalten) erhalten, basierend auf welchem ​​Fragment sichtbar ist. Ich habe bereits eine Lösung gefunden (knifflige Lösung), und ich möchte wissen, ob es andere Möglichkeiten gibt, das gleiche Ergebnis zu erzielen. Ich habe eine Menge Tutorial nur für ein einzelnes Fragment entwickelt. Unter dem, was ich getan habe:Sqlite-Daten in zwei ListView in zwei verschiedene Fragmente einfügen

Vor allem in meinem MainActivity ich habe:

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
    toolbar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getApplicationContext(),"Hai cliccato la barra",Toast.LENGTH_SHORT).show(); 
      fragment = new HomeFragment(); 
      if (fragment!=null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction ft = fragmentManager.beginTransaction(); 

       ft.replace(R.id.screen_area,fragment); 
       ft.commit(); 

      } 
     } 
    }); 

und von navigationView kann ich wählen, welches Fragment ich sehen will:

public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 

    } 
    if (fragment!=null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 

     ft.replace(R.id.screen_area,fragment); 
     ft.commit(); 
    } 

    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 

    int id= item.getItemId(); 

    switch(id){ 

     case R.id.carburante: 
      fragment = new CarburanteFragment(); 
      break; 
     case R.id.giorni: 
      fragment = new GiorniFragment(); 
      break; 

.. .after, dass auf meinem CarburanteFragment passiere ich das Fragment DbAdapter ... zum Beispiel in "Speichern":

private void save(String name) 
    { 
     DBAdapter db=new DBAdapter(getActivity(),((MainActivity) getActivity()).fragment= this); 
     db.openDB(); 
     boolean saved=db.add(name); 
     if(saved) 
     { 
      nameEditText.setText(""); 
      this.getSpacecrafts(); 
     }else { 
      Toast.makeText(getContext(),"Unable To Save",Toast.LENGTH_SHORT).show(); 
     } 
    } 

... finally I in DbAdapter Klasse kann das Fragment erhalten, die ich will Listview füllen .... zum Beispiel des Konstanten Variable verändert und so weiter .... in dem folgenden Code mir nur, wenn es funktioniert getestet:

public DBAdapter(Context c,Fragment fr) { 
    this.c = c; 
    helper = new DBHelper(c); 


    Fragment currentFragment =fr; 
      if(currentFragment.getTag()=="carburante") 
      Toast.makeText(c, currentFragment.toString(), Toast.LENGTH_LONG).show(); 


} 
+0

Ich weiß nicht, ob es in Ihrem Fall sinnvoll ist. Können Sie jedoch in Ihrer Aktivität ein Flag speichern, das sowohl das Fragment enthält als auch das Query db verwendet? –

+0

Oder wenn Sie die DB-Daten innerhalb Ihres Fragments zeigen, können Sie die Datenbank entsprechend abfragen. Wie wenn du zwei Fragmente hast: "HumansFrag" und "AnimalFrag". Dann abfragen 'HumansTable' in' HumansFrag' und 'AnimalTable' in' AnimalFrag' –

+0

ja, ich zeige Daten innerhalb eines ListView innerhalb von Fragment .... aber ich habe zwei verschiedene Fragmente und jeweils zwei verschiedene listView ... das Problem war wie aus DB auswählen, welche Daten geladen werden sollen ... meine Lösung steht oben. Ich denke, dass es möglich ist, nur ein Fragment und nur ein ListView zu laden und die richtigen Daten darin zu laden, sobald ich weiß (vielleicht von einem Klick auf die Schaltfläche), welche Art von ihnen ich will ... aber zu diesem Zeitpunkt nicht weiß nicht, wie man es implementiert :-) – Magobin

Antwort

0

Was Sie können eine Markierung übergeben, während Sie das Fragment ersetzen, das später zur Identifizierung der zu ladenden Daten verwendet werden kann.

Für fragment1

Fragment1 frag = new Fragment1(); 
Bundle bundle = new Bundle(); 
bundle.put("MY_FLAG", 1); 
frag.setArgument(bundle); 

Für fragment2

Fragment2 frag = new Fragment2(); 
Bundle bundle = new Bundle(); 
bundle.put("MY_FLAG", 2); 
frag.setArgument(bundle); 

Dann können Sie Daten in dem Flag verwenden, um festzustellen, welche Art von Daten, die Sie laden mögen.

Verwandte Themen