Собственные компоненты пользовательского интерфейса - обновлять при обновлении представлений Android

Мы пытаемся реализовать собственный компонент пользовательского интерфейса, который оборачивает компоненты Android, которые извлекают данные и отображают их, используя нашу существующую среду рендеринга (используя AdapterView). Мы не знаем, какие данные будут заранее, поэтому высота и содержание этого компонента абсолютно произвольны. Это в основном работает нормально, за исключением случая, когда визуализированные компоненты запрашивают что-то еще асинхронно (например, изображения). В этом случае изображение извлекается, ImageView "отображается", но пользовательский интерфейс ничего не показывает (буквально кажется прозрачным представлением соответствующего размера).

Мы знаем, что эти представления прекрасно работают в обычном Android, но нам, похоже, не хватает чего-то, что говорит RN/Yoga, что он должен повторно визуализироваться при загрузке изображений с сервера, чтобы они правильно отображались. Вот более или менее, как это выглядит:

public class ReactServerListComponent extends SimpleViewManager<LinearLayoutExtension> {
  private static final String REACT_CLASS = "TAReactServerListComponent";

  @Override
  public String getName() {
    return REACT_CLASS;
  }

  ...
  @ReactProp(name = "link")
  public void setLink(final LinearLayoutExtension view, String theNewLink){
    //async loader logic invokes this on success
    view.loadRetrievedEntries(newEntries); 
  }
  ...
}

В этом случае LinearLayoutExtension содержит все представления, созданные адаптером, который, в свою очередь, будет содержать асинхронно загружаемые представления изображений.

Мы попробовали несколько вещей, таких как возвращение ShadowNode с функцией измерения или сохраняя ссылку на ShadowNode и звонит dirty()и т. д. на нем.

Как правильно это сделать? К сожалению, мы не нашли документацию или примеры, которые имеют дело с действительно сложными компонентами, кроме "проверить репо"...

1 ответ

Вы могли бы попробовать view.invalidate() на группу. Вы также можете удалить заполнитель imageview и добавить более новый вид с правильным изображением.

Однако, если это только обновляет вид изображения, вы также можете использовать что-то вроде залпа, Пикассо, Глайда и т. Д., Чтобы позаботиться о самом виде изображения.