2017-06-15 2 views
0

Ich versuche, einige Daten (Name, Kategorie und fan_count) aller Seiten des Benutzers auf Facebook zu holen und dann das Ergebnis in einem ListView anzuzeigen Verwenden von ArrayAdapter.ArrayAdapter zeigt die Ausgabe auf dem Bildschirm nur, nachdem ich mein Telefon gesperrt und entsperrt habe

i Adapter meine benutzerdefinierten Array gemacht

public class PageAdapter extends ArrayAdapter<Page> { 
public PageAdapter(Context context, ArrayList<Page> pages) { 
    super(context, 0, pages); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View listItemView = convertView; 
    if (listItemView == null) { 
     listItemView = LayoutInflater.from(getContext()).inflate(
       R.layout.list_item_layout, parent, false); 
    } 
    final Page currentPage = getItem(position); 
    TextView nameText = (TextView) listItemView.findViewById(R.id.name); 
    TextView categoryText = (TextView) listItemView.findViewById(R.id.category); 
    TextView fanCountText = (TextView) listItemView.findViewById(R.id.fan_count); 

    nameText.setText(currentPage.getmName()); 
    categoryText.setText(currentPage.getmCategory()); 
    fanCountText.setText(currentPage.getmFanCount()); 

    return listItemView; 

} 

hier ist meine Seite Klasse

public class Page { 
private String mName; 
private String mCategory; 
private String mFanCount; 

public Page(String name, String category, String fanCount){ 
    mName = name; 
    mCategory = category; 
    mFanCount = fanCount; 
} 

public String getmName(){return mName;} 
public String getmCategory(){return mCategory;} 
public String getmFanCount(){return mFanCount;}} 

i bereits in Facebook angemeldet und rief eine Absicht, die Seiteactivity-Klasse öffnet, wo die ArrayAdapter Daten holen sollte und Zeige das Ergebnis über eine ListView.

public class PageActivity extends AppCompatActivity { 
private String category, fan_count, name; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_page); 

    final ArrayList<Page> pages = new ArrayList<>(); 

    Bundle param = new Bundle(); 
    param.putString("fields", "category,fan_count,name"); 
    new GraphRequest(
      AccessToken.getCurrentAccessToken(), 
      "/me/accounts", 
      param, 
      HttpMethod.GET, 
      new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
        try { 
         JSONObject root = new JSONObject(response.getRawResponse()); 
         JSONArray data = root.getJSONArray("data"); 

         for(int i=0 ; i<data.length() ; i++){ 
          JSONObject dataRoot = data.getJSONObject(i); 
          name = dataRoot.getString("name"); 
          category = dataRoot.getString("category"); 
          fan_count = dataRoot.getString("fan_count"); 

          pages.add(new Page(name, category, fan_count)); 
         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ).executeAsync(); 

    ListView pageListView = (ListView) findViewById(R.id.list); 
    final PageAdapter adapter = new PageAdapter(this, pages); 
    pageListView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
}} 

jetzt die ArrayAdapter die Daten erfolgreich abruft, sondern zeigt das Ergebnis in der Listenansicht nur, wenn ich sperren und mein Handy entsperren einmal, ich habe keine Ahnung, was mit dem Code falsch ist.

Antwort

1

sollten Sie Rufen Sie die notifyDataSetChange-Methode des Adapters nach dem Hinzufügen aller Zeilen auf. so sollte der Code wie folgt ändern:

new GraphRequest(
     AccessToken.getCurrentAccessToken(), 
     "/me/accounts", 
     param, 
     HttpMethod.GET, 
     new GraphRequest.Callback() { 
      public void onCompleted(GraphResponse response) { 
       try { 
        JSONObject root = new JSONObject(response.getRawResponse()); 
        JSONArray data = root.getJSONArray("data"); 

        for(int i=0 ; i<data.length() ; i++){ 
         JSONObject dataRoot = data.getJSONObject(i); 
         name = dataRoot.getString("name"); 
         category = dataRoot.getString("category"); 
         fan_count = dataRoot.getString("fan_count"); 

         pages.add(new Page(name, category, fan_count)); 

        } 
        //**********this line added!!!!!************* 
        adapter.notifyDataSetChanged(); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
).executeAsync(); 
+0

das hat geklappt..danke Ihnen so viel ....... aber werden Sie bitte erklären, was Sie hier getan haben. –

+0

Diese Zeile wurde nach dem Hinzufügen von Zeilen hinzugefügt: adapter.notifyDataSetChanged(); Nach jeder Änderung des Adapters sollten Sie notifyDataSetChange aufrufen, diese Methode aktualisiert die Ansicht der Liste –

0

Ich glaube, das ist, weil Sie die pages.add... auf einem Hintergrund-Thread aufrufen.

Ich weiß nicht mehr, ob Facebook dies tut oder nicht.

Als einfacher Test, ändern Sie den Code dazu:

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     pages.add(new Page(name, category, fan_count)); 
    } 
}); 

Wenn es funktioniert, dann wissen Sie, es ist ein Thread Problem, und Sie werden es nehmen haben es von

0

Sie die Daten in der Adapter anzeigt, bevor der Antrag eine Chance zu beenden hat.

Ich gehe davon aus, dass das Seitenobjekt (nicht sicher, wo es definiert ist) auch durch Lebenszyklusmethoden gespeichert wird, so dass die Erstellung des neuen Adapters die neuen Daten berücksichtigt. Sie können versuchen, den Adapter nach Abschluss der Anforderung neu zu erstellen.

Verwandte Themen