2

Ich versuche, eine parseQuery in meiner RecyclerAdapter Klasse zu tun:Klasse ist nicht abstrakt und nicht außer Kraft setzt abstrakte Methode durchgeführt (Object, Throwable) in ParseCallback2

// Differentiate between feedItem views and nativeAds 
    @Override 
    public int getViewType(int position) { 
     ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("NativeAd"); 
     query.whereEqualTo("objectId", "fYBeufqdOt"); 
     final int[] n = new int[1]; 
     query.getFirstInBackground(new GetCallback() { 
      @Override 
      public void done(ParseObject object, ParseException e) { 
       n[0] = Integer.valueOf(String.valueOf(object)); 
      } 
     }); 

     int viewType = VIEW_TYPE_MARKET_FEED; 
     if ((position % n[0] == 0) && position > 0) { 
      viewType = VIEW_TYPE_AD; 
     } 
     return viewType; 
    } 

ich die folgenden Fehler in meiner RecyclerAdapter Klasse erhalten :

Error:(75, 54) error: <anonymous com.elgami.market.MarketFeedRecyclerAdapter$1> is not abstract and does not override abstract method done(Object,Throwable) in ParseCallback2 

Was ist los? Soll ich die Abfrage woanders durchführen? Wenn ja, wo und wie?

+0

In der Ebene Englisch, müssen Sie das Verfahren implementieren done (Object, Throwable) in Ihrer ParseCallback2-Klasse –

+0

Ich habe keine ParseCallback2-Klasse. – santafebound

Antwort

2

Ich glaube, Sie die generische Typ der Klasse getCallback

@Override 
    public int getViewType(int position) { 
    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("NativeAd"); 
    query.whereEqualTo("objectId", "fYBeufqdOt"); 
    final int[] n = new int[1]; 
    query.getFirstInBackground(new GetCallback<ParseObject>() { 
     @Override 
     public void done(ParseObject object, ParseException e) { 
      n[0] = Integer.valueOf(String.valueOf(object)); 
     } 
    }); 

    int viewType = VIEW_TYPE_MARKET_FEED; 
    if ((position % n[0] == 0) && position > 0) { 
     viewType = VIEW_TYPE_AD; 
    } 
    return viewType; 
} 

die doc

Für Ihre zweite Frage sehen angeben müssen, und es ist wirklich schwierig

Sie verwendet haben, eine Tabelle int, um anonyme Klasse (GetCallback) zu ermöglichen, Daten in dem äußeren Bereich zu aktualisieren.

Dieser Trick ist jedoch aufgrund der Synchronisierungsprobleme nicht sehr gut, was der Fall ist, weil die GetCallback-Klasse zum Ausführen von Code verwendet wird, nachdem eine ParseQuery zum Abrufen eines ParseObject in einem Hintergrundthread verwendet wird.

Wenn also die JVM diese Bedingung if ((position % n[0] == 0) && position > 0) überprüft, wurde der Wert n [0] may noch nicht geändert.

Als Abhilfe können Sie eine Bedingung hinzufügen kann zu überprüfen, ob n [0] vor modifiziert wurde weiterhin Code ausgeführt wird, aber es ist wirklich nicht die beste Lösung

@Override 
    public int getViewType(int position) { 
    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("NativeAd"); 
    query.whereEqualTo("objectId", "fYBeufqdOt"); 
    final int[] n = new int[1]; 
    query.getFirstInBackground(new GetCallback<ParseObject>() { 
     @Override 
     public void done(ParseObject object, ParseException e) { 
      n[0] = Integer.valueOf(String.valueOf(object)); 
     } 
    }); 
    // waiting ... 
    while(n[0] == 0) Thread.currentThread().sleep(1000); 

    int viewType = VIEW_TYPE_MARKET_FEED; 
    if ((position % n[0] == 0) && position > 0) { 
     viewType = VIEW_TYPE_AD; 
    } 
    return viewType; 
} 
+0

Scheint zu funktionieren, außer der '' java.lang.ArithmeticException: dividiere durch null''. Seltsam, n [0] sollte gleich 25 sein. – santafebound

+0

könnten Sie zu dieser Ausnahme genauer sein (Code, Fehlermeldung) –

+0

Fair genug. Ich schätze Ihre Untersuchung in jeder Hinsicht. Ich denke, ich muss mehr Forschung betreiben, um das effizienter zu machen. – santafebound

Verwandte Themen