Если я правильно вас понял, вы уже пробовали:
...
public void done(final List<ParseObject> followList2, ParseException e) {
...
Что по какой-то причине делает компилятор недовольным.
Я думаю, что может быть два возможных решения
- Если вы планируете использовать объекты followList2 в другом месте вашего Activity/Fragment. Затем просто объявите переменную поля для хранения результата и чтения вместо этого. Таким образом, анонимный внутренний класс должен иметь к нему доступ.
- Запишите followList2 в другую локальную переменную, которая объявлена как final. Таким образом, мы не меняем сигнатуру обратного вызова done().
Решение 1:
List<ParseObject> mFollowList2; // field variable outside method
...
public void done(List<ParseObject> followList2, ParseException e) {
mFollowList2 = followList2;
// use mFollowList2 in rest of code
...
Решение 2:
public void done(List<ParseObject> followList2, ParseException e) {
final List<ParseObject> finalFollowList2 = followList2;
// use finalFollowList2 in rest of code
...
Как сказано в комментариях, я не могу вспомнить, чтобы у меня была такая же проблема, но я надеюсь, что это решит проблему.
Третьим предложением было бы попробовать Bolts https://github.com/BoltsFramework/Bolts-Android (поставляется с API синтаксического анализа). Если вы знакомы с промисами в javascript, Bolts практически не отличается от Java. Это устраняет необходимость вложенных вызовов, создавая фрагмент кода в форме пирамиды по мере роста количества зависимых запросов. Однако на привыкание требуется некоторое время, а в простых случаях оно и не нужно.
Бонус:
Поскольку у вас возникли проблемы с использованием текста из вашего включения в адаптер, я покажу вам часть своего кода в качестве примера.
Во-первых, у меня есть простой макет для элемента: res/layout/view_adapter_item_simple.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="?android:attr/activatedBackgroundIndicator"
android:paddingTop="5dp">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="item" />
</RelativeLayout>
Далее, вот мой пользовательский адаптер:
public class SimpleParseAdapter<T extends ParseObject> extends
ParseQueryAdapter<T> {
private static final String TAG = SimpleParseAdapter.class.getSimpleName();
private final String textCol;
public SimpleParseAdapter(Context context, String textCol,
QueryFactory<T> queryFactory) {
super(context, queryFactory);
this.textCol = textCol;
}
TextView text;
@Override
public View getItemView(T object, View v, ViewGroup parent) {
if (v == null) {
v = View.inflate(getContext(), R.layout.view_adapter_item_simple,
null);
}
super.getItemView(object, v, parent);
text = (TextView) v.findViewById(R.id.text);
text.setText(object.getString(textCol));
return v;
}
}
ВНИМАНИЕ: Мы еще не совсем там. Это работает аналогично стандартному ParseQueryAdapter, поскольку он просматривает только столбцы текущего класса, используя text.setText(object.getString(textCol))
.
Однако можно довольно легко написать специальный адаптер для обработки вложенных включений, например:
public class SimpleParseIncludeAdapter<T extends ParseObject> extends
ParseQueryAdapter<T> {
private static final String TAG = SimpleParseIncludeAdapter.class.getSimpleName();
private final String includeCol;
private final String textCol;
public SimpleParseIncludeAdapter(Context context, String includeCol, String textCol,
QueryFactory<T> queryFactory) {
super(context, queryFactory);
this.includeCol = includeCol;
this.textCol = textCol;
}
TextView text;
@Override
public View getItemView(T object, View v, ViewGroup parent) {
if (v == null) {
v = View.inflate(getContext(), R.layout.view_adapter_item_simple,
null);
}
super.getItemView(object, v, parent);
text = (TextView) v.findViewById(R.id.text);
text.setText(object.getParseObject(includeCol).getString(textCol));
return v;
}
}
Теперь с помощью адаптера следующим образом:
new SimpleParseIncludeAdapter(**context**, "lokal", "place",**queryFactory**);
Где queryFactory обязан выполнить query.include("lokal")
(включает весь указатель «local») или `query.include («local.place») (включает только столбец «место» в «local»);
Дополнительный бонус — создание подклассов
И последнее замечание: похоже, вы не используете подклассы, но если бы вы это делали, у вас также мог бы быть специализированный пользовательский адаптер для подклассов Cena.
public class CenaParseAdapter extends
ParseQueryAdapter<Cena> {
private static final String TAG = CenaParseAdapter.class.getSimpleName();
public CenaParseAdapter(Context context,
QueryFactory<Cena> queryFactory) {
super(context, queryFactory);
}
TextView text;
@Override
public View getItemView(Cena cena, View v, ViewGroup parent) {
if (v == null) {
v = View.inflate(getContext(), R.layout.view_adapter_item_simple,
null);
}
super.getItemView(object, v, parent);
text = (TextView) v.findViewById(R.id.text);
text.setText(cena.getPlace());
return v;
}
}
В этом случае cena.getPlace()
может найти включенный локал:
// inside Cena sublass
public Lokal getLokal() { // assuming Lokal also is subclassed
return (Lokal)getParseObject("lokal");
}
public String getPlace() {
return (getLokal() != null) ? getLokal().getPlace() : "";
}
// inside Lokal subclass
public String getPlace() {
return getString("place");
}
person
cYrixmorten
schedule
13.06.2015
followList2
:followList2.get(0)
. В качестве оптимизации вы можете сделатьquery3.getFirstInBackground(...)
вместоquery3.findInBackground(...)
- person cYrixmorten   schedule 14.06.2015getFirstInBackground
лучший выбор. Странно, я видел это раньше в quide и все же не использовал его! - person jean d'arme   schedule 14.06.2015