Как использовать изображение, хранящееся в Firebase Storage? - PullRequest
0 голосов
/ 28 марта 2019

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

Итак, изображения хранятся в Firebase Storage в папке с именем images;в рамках этого им дается случайно сгенерированное имя, которое сохраняется в соответствующей записи в базе данных.Допустим, имя определенного изображения - «abcd.png», тогда запись в базе данных будет выглядеть следующим образом:

symbols 
  > key1 > name: "Test symbol"
           uid: "User's randomly generated ID"
           description: "A description, as set by the user"
           url: "images/abcd.png"

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

Символы показаны во фрагменте с именем CurrentSymbolsFragment.Макет (frag_current_symbols.xml):

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <GridView
        android:id="@+id/gridview_symbolList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:stretchMode="columnWidth"
    </GridView>

</android.support.constraint.ConstraintLayout>

и файл класса:

public class FragmentCurrentSymbols extends Fragment {

    private ArrayList<ChartSymbol>           mSymbols;
    private Context             mContext;
    private GridView            mGridCurrentSymbols;

    static public FragmentCurrentSymbols newInstance(Context context,
                                                     ArrayList<ChartSymbol> symbols) {

        if(context == null)         return null;
        if(symbols == null)         return null;
        if(symbols.size() == 0)     return null;

        FragmentCurrentSymbols f = new FragmentCurrentSymbols();
        f.setRequiredData(context, symbols);

        return f;
    }

    public void setRequiredData(Context context, ArrayList<ChartSymbol> symbols) {

        if(context == null)         return;
        if(symbols == null)         return;
        if(symbols.size() == 0)     return;

        this.mContext = context;
        this.mSymbols = symbols;

    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        // Inflate layout
        View rootView = inflater.inflate(R.layout.fragment_current_symbols, container, false);

        mGridCurrentSymbols = rootView.findViewById(R.id.gridview_symbolList)

        initialiseWithSymbols();

        return rootView;
    }

    // Set symbols to be shown and initialise the view
    public void setSymbols(ArrayList<ChartSymbol> symbols) {
        mSymbols = symbols;
        initialiseWithSymbols();
    }

    /**
     * initialiseWithSymbols
     * Initialise the symbol list from the symbols
     * This takes the symbols and shows them, in order, in the grid
     **/
    public void initialiseWithSymbols() {

        if (mSymbols == null) return;

        // Now set up ChartSymbolAdapter to display symbols in grid
        ChartSymbolAdapter mSymbolAdapter = new ChartSymbolAdapter(mContext,
                R.layout.adapter_symbol_manage_layout,
                mSymbols);
        mGridCurrentSymbols.setAdapter(mSymbolAdapter);
        mGridCurrentSymbols.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }

Класс ChartSymbolAdapter:

public class ChartSymbolAdapter extends ArrayAdapter<ChartSymbol> {

    private Context                 mContext;
    private ArrayList<ChartSymbol>  mSymbolArray;
    private int                     layoutId;
    private ChartSymbol             selectedSymbol;

    public ChartSymbolAdapter(Context context, int layout_id, ArrayList<ChartSymbol> symbolArray) {
        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) {

        ViewHolder mViewHolder;
        StorageReference mStorageRef = FirebaseStorage.getInstance().getReference();

        if(convertView == null) {
            mViewHolder = new ViewHolder();
            LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert layoutInflater != null;
            convertView = layoutInflater.inflate(layoutId, parent, false);
            mViewHolder.symbolCell = convertView.findViewById(R.id.symbol_cell);
            mViewHolder.symbolName = convertView.findViewById(R.id.symbol_name);
            mViewHolder.symbolKey = convertView.findViewById(R.id.symbol_key);
            convertView.setTag(mViewHolder);
            // Now add the symbol
            ChartSymbol cellSymbol = mSymbolArray.get(position);
            // Find the url
            String drawableUrl = cellSymbol.getUrl();
            // If there's a Url, use it
            if(drawableUrl != null) {
                    Glide.with(getContext())
                            .load(drawableUrl)
                            .into(mViewHolder.symbolCell);
            }
        }

        return convertView;
    }

}

SymbolCell класс расширяется ImageView:

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

    ChartSymbol symbol;
    Paint paint;

    public SymbolCell(Context thisContext, AttributeSet attrs) {
        super(thisContext, attrs);

        paint = new Paint();

    }

    /**
     * onDraw
     * Draw a square to contain the given symbol.
     * @param canvas Canvas to draw on
     */
    protected void onDraw(Canvas canvas) {
        // Draw a box around cell
        // Set paint
        int stroke_width = 2;
        paint.setStrokeWidth(stroke_width);

        float height = getHeight();
        float width = getWidth();

        // Draw a black border for item
        paint.setColor(0xff000000);

        paint.setStyle(Paint.Style.STROKE);
        canvas.drawRect(0, 0, width - 2*stroke_width, height - 2*stroke_width, paint);

    }

}

Когда я пробую это, я получаю серию пустых коробок.Там столько блоков, сколько у меня хранится символов, так что это правильно, но они не показывают фактическое изображение.Я убедился, что я использую изображения, цвета которых идут прямо по краям, так что это не проблема.

Я впервые использую Glide в проекте, поэтому я делаючто-то не так?

Используя отладчик, я вижу, что символы правильно извлекаются из Firestore, и что URL-адрес правильный.Я не уверен, как проверить, действительно ли Glide подключается к хранилищу, чтобы найти изображение, но оно определенно не показывает его.

Кто-нибудь может увидеть, где я ошибаюсь?

...