如何使用Glide在ImageView中显示来自URL的图像?

时间:2019-05-09 16:38:11

标签: android-glide

我正在编写一个允许用户将图像上传到Firebase Storage的应用程序。有一个活动列出了他们所有上传的图像,但是我无法显示该图像。

使用图像的类称为Symbol.java。每个Symbol都有名称,描述,用户ID和图像。图像存储在Firebase存储中,然后url存储在Symbol中,该文件位于Firestore中称为符号的表中。此位工作正常-我可以上传图片并正确存储网址。这样会在符号表中提供一个条目,如下所示:

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

因此,活动获取当前用户的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 Module所需的信息。我真的不知道这意味着什么,也找不到任何可以澄清的模块,因此我创建了一个名为“ 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,所以真的不知道从哪里开始。有人可以建议吗?谢谢。

0 个答案:

没有答案