Как показать изображение из URL в ImageView с помощью Glide? - PullRequest
0 голосов
/ 09 мая 2019

Я пишу приложение, которое позволяет пользователю загружать изображение в Firebase Storage.Есть действие, в котором перечислены все их загруженные изображения, но я не могу показать его.

Класс, который использует изображения, называется Symbol.java.Каждый Symbol имеет имя, описание, идентификатор пользователя и изображение.Изображение сохраняется в Firebase Storage, а затем URL-адрес сохраняется в Symbol, который находится в таблице, называемой символами в Firestore.Этот бит работает нормально - я могу загрузить изображение и правильно сохранить URL-адрес.Это дает запись в таблице символов следующим образом:

symbols > symbol_key > name = "Example"
                       description = "Example symbol"
                       uid = "{My user id}"
                       url = "images/image_name.png"

Итак, Activity получает список текущего пользователя Symbols и сохраняет его как ArrayList<Symbol>.Этот бит работает нормально - символы правильно извлекаются и настраиваются в ArrayList.Список используется в следующей функции, которая отображает символы в сетке:

private void initialiseWithSymbols() {

    if (mSymbols == null) return;

    SymbolAdapter mSymbolAdapter
            = new SymbolAdapter(
                    mContext,
                    mSymbols,
                    R.layout.adapter_symbol_manage_layout);
    mGridCurrentSymbols.setAdapter(mSymbolAdapter);
    mGridCurrentSymbols.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

}

R.layout.adapter_symbol_manage_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="4dp"
    android:paddingBottom="4dp">

    <myapp.models.SymbolCell
        android:layout_width="@dimen/grid_cell_column_width"
        android:layout_height="@dimen/grid_cell_column_width"
        android:id="@+id/symbol_cell"/>

    <TextView
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/symbol_key"
        tools:ignore="RtlSymmetry" />

</LinearLayout>

, где myapp.models.SymbolCell:

public class SymbolCell extends  android.support.v7.widget.AppCompatImageView {

    private Symbol mSymbol;          // Symbol to be shown

    public SymbolCell(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Symbol getSymbol() { return this.mSymbol; }

    public void setSymbol(Symbol symbol) { this.mSymbol = symbol; }

    // Draw the symbol
    protected void onDraw(Canvas canvas) {

        if(this.mSymbol == null) return;

        // Draw the symbol
        String drawableUrl  = mSymbol.getUrl();
        Context context = getContext();

        if(drawableUrl != null) {
            Glide.with(context)
                    .load("http://path_to_image")
                    .into(this);
        }
    }

}

Примечание. В настоящее время я добавил фиксированный path_to_image;не удалось получить URL-адрес изображения из БД и настроить его.Я проверил, что изображение, которое я использовал, определенно существует, и оно не прозрачное / белое.

SymbolAdapter - это:

public class SymbolAdapter extends ArrayAdapter<Symbol> {

    private final Context                     mContext;
    private final ArrayList<Symbol>           mSymbolArray;
    private final int                         layoutId;

    public SymbolAdapter(Context context, ArrayList<Symbol> symbolArray,
                                  int layout_id) {
        super(context, layout_id, symbolArray);

        this.mContext           = context;
        this.mSymbolArray       = symbolArray;
        this.layoutId           = layout_id;

    }

    private static class ViewHolder {
        private SymbolCell symbolCell;
        private TextView symbolName, symbolKey;
    }

    @NonNull
    @Override
    public View getView(final int position, View convertView, @NonNull ViewGroup parent) {

        final ViewHolder mViewHolder;

        if(convertView == null) {

            mViewHolder = new ViewHolder();

            LayoutInflater layoutInflater
                    = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(layoutId, parent, false);

            mViewHolder.symbolCell  = convertView.findViewById(R.id.symbol_cell);

            convertView.setTag(mViewHolder);

            // Set up the View Holder
            Symbol cellSymbol = mSymbolArray.get(position);

            // Symbol Cell
            SymbolCell symbolCell = mViewHolder.symbolCell;

            if (symbolCell != null) {
                    symbolCell.setSymbol(cellSymbol);


            // Symbol Name
            if(mViewHolder.symbolName != null) {
                mViewHolder.symbolName.setText(cellSymbol.getName());
            }

            // Symbol Key
            if(mViewHolder.symbolKey != null) {
                mViewHolder.symbolKey.setText(cellSymbol.getKey());
            }
        }

        return convertView;
    }

    public int getCount() { return mSymbolArray.size(); }

    public Symbol getItem(int position) { return mSymbolArray.get(position); }

}

Итак, когда я делаю это, я простоувидеть сетку пустых белых квадратов.Я пробовал различные учебные пособия и понял, что мне нужно создать модуль Glide ... Я действительно не знаю, что это значит, и не смог найти ничего, что прояснило бы это, поэтому я создал файл с именем "MyAppGlideModule.java."(только с классами Activity), который в основном пуст:

@GlideModule
public class MyAppGlideModule extends AppGlideModule {}

Я пытался заменить

Glide.with(context).load("http://path_to_image").into(this);

выше на

GlideApp.with(context).load("http://path_to_image").into(this);

, ноэто, казалось, не имело никакого значения.Я также попытался заменить его на «MyAppGlideModule» вместо «Glide», но тогда он не позволил бы мне сделать «.with ()».

Я не уверен, что делаю неправильно -Я никогда раньше не пользовался Glide, поэтому не знаю, с чего начать.Кто-нибудь может посоветовать?Спасибо.

...