我正在尝试在我的 RecyclerAdapter 类中执行 ParseQuery:
// 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;
}
我的 RecyclerAdapter 类出现以下错误:
Error:(75, 54) error: <anonymous com.elgami.market.MarketFeedRecyclerAdapter$1> is not abstract and does not override abstract method done(Object,Throwable) in ParseCallback2
这是怎么回事?我应该在别处执行查询吗?如果是,在哪里以及如何?
最佳答案
我认为你需要指定类 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;
}
参见 doc
关于你的第二个问题,嗯,这真的很棘手
您使用了一个 int 表来允许匿名类 (GetCallback
) 更新外部作用域中的数据。
但是,由于同步问题,这个技巧不是很好,情况就是这样,因为 GetCallback 类用于在后台线程中使用 ParseQuery 获取 ParseObject 之后运行代码。强>
所以当 JVM 检查这个条件时 if ((position % n[0] == 0) && position > 0)
值 n[0] 可能还没有被修改。
作为解决方法,您可以添加一个条件来检查 n[0] 是否已被修改,然后再继续运行您的代码,但这确实不是最佳解决方案
@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;
}
关于java - 类不是抽象的,并且不会覆盖 ParseCallback2 中的抽象方法 done(Object,Throwable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38332653/