Я создаю приложение, которое позволяет пользователю загружать свои собственные изображения для использования в приложении.Я использую базу данных 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 подключается к хранилищу, чтобы найти изображение, но оно определенно не показывает его.
Кто-нибудь может увидеть, где я ошибаюсь?