Я пытаюсь написать запрос разбора, который получает все подъемы, связанные с местоположением. Затем я помещаю, затем помещаю каждое восхождение в ряд и помещаю его в представление переработчика под названием местоположения (само представление переработчика находится внутри нижнего листа, но я не думаю, что это имеет значение). Я получаю сообщение об ошибке:
E / libprocessgroup: set_timerslack_ns Ошибка записи: операция не разрешена E / LocationActivity: проблема с получением маршрутов. Com.parse.ParseException: java .lang.IllegalArgumentException: недопустимый тип для ParseObject : class com.example.climb.activities.LocationActivity
public class LocationActivity extends AppCompatActivity
{
public static final String TAG = "LocationActivity";
private TextView tvLocationName;
private TextView tvLocationDescription;
private TextView tvLocationLatLong;
private String locationId;
private RecyclerView rvRoutes;
protected LocationAdapter adapter;
protected List <Route> allRoutes;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
locationId = getIntent().getStringExtra("locationId");
if (locationId == null)
{
finish();
}
tvLocationName = findViewById(R.id.tvLocationName);
tvLocationDescription = findViewById(R.id.tvLocationDescription);
tvLocationLatLong = findViewById(R.id.tvLocationLatLong);
ParseQuery query = ParseQuery.getQuery(Location.class);
query.getInBackground(locationId, new GetCallback<Location>()
{
@Override
public void done(Location location, ParseException e)
{
if (e != null)
{
Log.e(TAG, "Error while querying database for location.");
e.printStackTrace();
return;
}
tvLocationName.setText(location.getName());
tvLocationDescription.setText(location.getDescription());
tvLocationLatLong.setText(location.getLatLong().toString());
}
});
rvRoutes = findViewById(R.id.rvRoutes);
allRoutes = new ArrayList<>();
adapter = new LocationAdapter(this, allRoutes);
rvRoutes.setAdapter(adapter);
rvRoutes.setLayoutManager(new LinearLayoutManager(this));
queryRoutes();
}
protected void queryRoutes() {
ParseQuery<Route> query = ParseQuery.getQuery(Route.class);
query.include(Route.KEY_LOCATION);
query.whereEqualTo("location", locationId);
//query.setLimit(20);
query.addDescendingOrder(Route.KEY_CREATED_AT);
query.findInBackground(new FindCallback<Route>() {
@Override
public void done(List<Route> routes, ParseException e) {
if (e != null) {
Log.e(TAG, "Issue with getting routes", e);
return;
}
for (Route route : routes) {
Log.i("Route", "Name: " + route.getName());
}
adapter.clear();
allRoutes.addAll(routes);
adapter.notifyDataSetChanged();
}
});
}
}
Модель маршрута
@ParseClassName("Route")
public class Route extends ParseObject
{
public static final String KEY_OBJECT_ID = "objectId";
public static final String KEY_NAME = "name";
public static final String KEY_DESCRIPTION = "description";
public static final String KEY_LOCATION = "location";
public static final String KEY_DIFFICULTY = "difficulty";
public static final String KEY_METHOD = "method";
public static final String KEY_THUMBNAIL = "thumbnail";
public String getId() { return getString(KEY_OBJECT_ID); }
public void setId(String objectId) { put(KEY_OBJECT_ID, objectId); }
public String getName() { return getString(KEY_NAME); }
public void setName(String name) { put(KEY_NAME, name); }
public String getDescription() { return getString(KEY_DESCRIPTION); }
public void setDescription(String description) { put(KEY_DESCRIPTION, description); }
public ParseObject getLocation() { return getParseObject(KEY_LOCATION); }
public void setLocation(ParseObject location) { put(KEY_LOCATION, location); }
public String getDifficulty() { return getString(KEY_DIFFICULTY); }
public void setDifficulty(String difficulty) { put(KEY_DIFFICULTY, difficulty); }
public String getMethod() { return getString(KEY_METHOD); }
public void setMethod(String method) { put(KEY_METHOD, method); }
public ParseFile getThumbnail() { return getParseFile(KEY_THUMBNAIL); }
public void setThumbnail(ParseFile thumbnail) { put(KEY_THUMBNAIL, thumbnail); }
protected void queryPhotos() {
ParseQuery<Photo> query = ParseQuery.getQuery("Photos");
query.include(Photo.KEY_ASSOC_CLASS_ID);
query.whereEqualTo(Route.KEY_OBJECT_ID, this);
//query.setLimit(20);
query.addDescendingOrder(Photo.KEY_CREATED_AT);
query.findInBackground(new FindCallback<Photo>() {
@Override
public void done(List<Photo> photos, ParseException e) {
if (e != null) {
Log.e("Route", "Issue with getting photos", e);
return;
}
for (Photo photo : photos) {
Log.i("Route", "Post: " + photo.getImage());
}
//allPhotos.addAll(photos);
//adapter.notifyDataSetChanged();
}
});
}
}
Модель местоположения
@ParseClassName("Location")
public class Location extends ParseObject
{
public static final String KEY_OBJECT_ID = "objectId";
public static final String KEY_NAME = "name";
public static final String KEY_DESCRIPTION = "description";
public static final String KEY_LAT_LONG = "latLong";
public String getId() { return getString(KEY_OBJECT_ID); }
public void setId(String objectId) { put(KEY_OBJECT_ID, objectId); }
public String getName() { return getString(KEY_NAME); }
public void setName(String name) { put(KEY_NAME, name); }
public String getDescription() { return getString(KEY_DESCRIPTION); }
public void setDescription(String description) { put(KEY_DESCRIPTION, description); }
public ParseGeoPoint getLatLong() { return getParseGeoPoint(KEY_LAT_LONG); }
public void setLatLong(ParseGeoPoint latLong) { put(KEY_LAT_LONG, latLong); }
}
Адаптер местоположения (переводит маршруты в представление переработчика:
public class LocationAdapter extends RecyclerView.Adapter<LocationAdapter.ViewHolder> {
private Context context;
private List<Route> routes;
public LocationAdapter(Context context, List<Route> routes) {
this.context = context;
this.routes= routes;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_climb, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Route route = routes.get(position);
holder.bind(route);
}
@Override
public int getItemCount() {
return routes.size();
}
public void clear() {
routes.clear();
notifyDataSetChanged();
}
// Add a list of items -- change to type used
public void addAll(List<Route> list) {
routes.addAll(list);
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView tvClimbName;
private TextView tvClimbDescription;
private ImageView ivClimbThumbnail;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvClimbName = itemView.findViewById(R.id.tvClimbName);
tvClimbDescription = itemView.findViewById(R.id.tvClimbDescription);
ivClimbThumbnail = itemView.findViewById(R.id.ivClimbThumbnail);
}
public void bind(Route route) {
// Bind the post data to the view element
tvClimbName.setText(route.getName());
tvClimbDescription.setText(route.getDescription());
ParseFile image = route.getThumbnail();
if (image != null) {
Glide.with(context).load(image.getUrl()).into(ivClimbThumbnail);
}
}
}
}