2016-04-23 12 views
-1

Also habe ich diese Frage vorher gestellt, aber es funktionierte nicht mehr, nachdem ich versucht habe, die Navigationsleiste zu öffnen und zu einem anderen Tab zu gehen und dann zurück zu gehen. Es zeigt keine Daten in einer Liste noch einmal an. Danke im Voraus!ListFragment Keine Daten aus der Liste anzeigen

Hauptaktivität

package com.goldleaf.branden.goldleafcomics; 

import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuItem; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.kosalgeek.android.json.JsonConverter; 
import com.kosalgeek.genasync12.AsyncResponse; 
import com.kosalgeek.genasync12.PostResponseAsyncTask; 


import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{ 
    ListView lvGlimpse; 
    public List<UniverseListing>universalListings = new ArrayList<UniverseListing>(); 
    final GlimpseListFragment glimpse = new GlimpseListFragment(); 

    NavigationView navigationView; 
    Toolbar toolbar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String url = "http://goldleafcomics.com/application/UniverseGlimpse.JSON"; 
     PostResponseAsyncTask task = new PostResponseAsyncTask(MainActivity.this, new AsyncResponse() { 
      @Override 
      public void processFinish(String s) { 
       universalListings = new JsonConverter<UniverseListing>().toArrayList(s, UniverseListing.class); 
       Toast.makeText(MainActivity.this, "Application Data Refreshed", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     task.execute(url); 

     android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, glimpse); 
     fragmentTransaction.commit(); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setTitle("Glimpse"); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_news) { 
      getSupportActionBar().setTitle("G.C. News"); 
     } else if (id == R.id.nav_team) { 
      TeamFeedFragment fragment = new TeamFeedFragment(); 
      android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_container, fragment); 
      getSupportActionBar().setTitle("Team Feed"); 
      fragmentTransaction.commit(); 
     }else if(id == R.id.nav_notifications){ 
      getSupportActionBar().setTitle("Notifications"); 
     }else if(id == R.id.nav_comics){ 
      getSupportActionBar().setTitle("Comics"); 
     }else if(id == R.id.nav_glimpse){ 
      android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_container, glimpse); 
      getSupportActionBar().setTitle("Glimpse"); 
      fragmentTransaction.commit(); 
     } 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 
} 

UniverseListing

package com.goldleaf.branden.goldleafcomics; 

import com.google.gson.annotations.SerializedName; 

public class UniverseListing { 
    @SerializedName("universe_id") 
    public String universeId; 

    @SerializedName("universe_glimpse") 
    public String universeGlimpse; 

    @SerializedName("universe_url") 
    public String universeuRL; 

} 

Glimpse Liste Fragment

package com.goldleaf.branden.goldleafcomics; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.kosalgeek.android.json.JsonConverter; 
import com.kosalgeek.genasync12.*; 

import java.io.FileInputStream; 
import java.util.ArrayList; 
import java.util.List; 

public class GlimpseListFragment extends ListFragment { 
    List<UniverseListing> universalListings = new ArrayList<UniverseListing>(); 
    List<String> glimpse = new ArrayList<String>(); 
    List<String> titles = new ArrayList<String>(); 

    public GlimpseListFragment() { 
    } 

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

     ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_glimpse_list, container, false); 

     return rootView; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MainActivity act = new MainActivity(); 

     universalListings = act.universalListings; 

     ArrayList<String> glimpse = new ArrayList<String>(); 
     for(UniverseListing value: universalListings){ 
      glimpse.add(value.universeGlimpse); 
     } 

     ArrayList<String> titles = new ArrayList<String>(); 
     for(UniverseListing value: universalListings){ 
      titles.add(value.universeId); 
     } 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, titles); 
     setListAdapter(adapter); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     String value = (String)getListAdapter().getItem(position); 
     Toast.makeText(getActivity(), value, Toast.LENGTH_LONG).show(); 
    } 
} 
+0

tun nie 'neue MainActivity(); '... Sie können' getActivity' von einem Fragment aufrufen –

+0

ich mache das, weil ich eine Variable von ihm aufrufen und ich konnte getAktivity nicht verwenden –

+0

1) Sie hätten es umwandeln müssen 2) Sie sollten nicht brauchen um das trotzdem zu tun. Wenn meine Antwort unten das Problem nicht anspricht, dann lass es mich wissen –

Antwort

0

Sie eine Aktivität Instanz erstellen, die nicht vom Android-Lebenszyklus verwaltet wird, so dass die Arraylist Das, was Sie verwenden möchten, ist leer, weil es in der onCreate-Methode des Akts nie aufgefüllt wurde Iktivität.

MainActivity act = new MainActivity(); 

    universalListings = act.universalListings; // size = 0 

Zusammen mit, dass haben Sie einige asynchronen Codes Ihre Daten holen zu gehen, so dass nicht einmal das Fragment kann die Liste, die Sie herunterladen, wenn die FragmentTransaction abgeschlossen ist.

Sie werden die Arraylist an den Adapter aus dem Fragment in der processFinish Methode übergeben müssen Sie haben, oder dass AsyncTask Code nennen das Fragment nach innen, und füllen Sie den Adapter aus dem Inneren des processFinish Methode

+0

, also muss ich mich bewegen 'String url = "http://goldleafcomics.com/application/UniverseGlimpse.JSON"; PostResponseAsyncTask Aufgabe = new PostResponseAsyncTask (MainActivity.this, neue AsyncResponse() { @Override public void processFinish (String s) { universalListings = new JsonConverter () toArrayList (s, UniverseListing.class). Toast .makeText (MainActivity.this, "Anwendungsdaten aktualisiert", Toast.LENGTH_LONG) .show(); } }); task.execute (url); ' zu dem Fragment, anstatt es im Hauptakt zu haben? –

+0

Das Verschieben der AsyncTask ist eine Option, ja. Eine andere wäre, eine Methode in Ihrem Fragment zu erstellen, die die Liste als Parameter akzeptiert und den Adapter auffüllt. Sie müssen diese Methode innerhalb des Callbacks von AsyncTask processFinish verwenden –

+0

Da die AsyncTask in die onCreate-Fragmentmethode verschoben wurde, muss ich noch eine neue Methode zum Auffüllen des Adapters erstellen? –

Verwandte Themen