Я пытаюсь повторно использовать рамку, которая имеет изображение и текстовое изображение внутри него, но я не думаю, что я делаю это правильно. Код работает, и дисплей прав, но производительность очень плохая, и я считаю, что это связано с тем, что я создаю новый ImageView и TextView каждый раз, когда адаптеры возвращаются к позиции позиции.Android: повторное использование встроенных представлений в gridview [решение опубликовано]
Может ли кто-нибудь сказать мне, как повторно использовать встроенный ImageView (называемый i) и TextView (называемый t) без создания новых объектов? Я очень новичок в Java, и это моя попытка создать приложение для Android.
public View getView(int position, View convertView, ViewGroup parent) {
FrameLayout F;
FrameLayout ImageBorder;
FrameLayout TextBG;
ImageView i;
TextView t;
if(convertView == null) {
F = new FrameLayout(mContext);
} else {
F = (FrameLayout) convertView;
}
ImageBorder = new FrameLayout(F.getContext());
FrameLayout.LayoutParams params1 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,300,Gravity.BOTTOM);
ImageBorder.setLayoutParams(params1);
i = new ImageView(F.getContext());
TextBG = new FrameLayout(F.getContext());
t = new TextView(F.getContext());
F.setBackgroundColor(Color.BLACK);
ImageBorder.setPadding(2, 2, 2, 2);
ImageBorder.setBackgroundColor(Color.BLACK);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,40,Gravity.BOTTOM);
TextBG.setLayoutParams(params);
TextBG.setBackgroundColor(Color.BLACK);
TextBG.setAlpha(.6f);
t.setLayoutParams(params);
t.setGravity(Gravity.CENTER_VERTICAL);
String pathToPhoto = FileList.get(position).toString();
String fileDescription = pathToPhoto.replaceAll("/mnt/external1/PaliPhotography/","");
fileDescription = fileDescription.replaceAll(".jpg","");
fileDescription = fileDescription.toUpperCase();
Bitmap bm = Cache.getCacheFile("thumb",pathToPhoto);
if (bm == null) {
ImageDownloader downloader = new ImageDownloader(i);
downloader.execute("thumb", pathToPhoto, "400", "400");
} else {
i.setImageBitmap(bm);
i.setScaleType(ImageView.ScaleType.CENTER_CROP);
t.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Large);
t.setText(" " + fileDescription);
}
ImageBorder.addView(i);
ImageBorder.addView(TextBG);
ImageBorder.addView(t);
F.addView(ImageBorder);
return F;
}
}
Заранее спасибо!
[EDIT]
--------------------------- РЕШЕНИЕ -------- ---------------------------------------------
Вот решение, которое я реализовал на основе обратной связи ниже! Спасибо!
public View getView(int position, View convertView, ViewGroup parent) {
View ReturnThisView;
ViewHolder holder;
LayoutInflater inflater;
holder = new ViewHolder();
if(convertView == null) {
inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ReturnThisView = inflater.inflate(R.layout.imagecell, null);
ReturnThisView.setTag(holder);
} else {
ReturnThisView = convertView;
}
holder.TextDescription = (TextView) ReturnThisView.findViewById(R.id.PhotoDesc);
holder.ImageThumbnail = (ImageView) ReturnThisView.findViewById(R.id.Thumbnail);
String pathToPhoto = FileList.get(position).toString();
String fileDescription = pathToPhoto.replaceAll("/mnt/external1/PaliPhotography/","");
fileDescription = fileDescription.replaceAll(".jpg","");
fileDescription = fileDescription.toUpperCase();
Bitmap bm = Cache.getCacheFile("thumb",pathToPhoto);
if (bm == null) {
ImageDownloader downloader = new ImageDownloader(holder.ImageThumbnail);
downloader.execute("thumb", pathToPhoto, "400", "400");
} else {
holder.ImageThumbnail.setImageBitmap(bm);
holder.ImageThumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.TextDescription.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Large);
holder.TextDescription.setText(" " + fileDescription);
}
return ReturnThisView;
}
}
static class ViewHolder {
TextView TextDescription;
ImageView ImageThumbnail;
}
Спасибо вам большое за помощь! У меня есть это решение наполовину реализовано уже, но я не знаю, что такое объект-держатель и как его реализовать. Является ли объект, который позволит мне удерживать как изображение, так и текст в себе? Я попытался найти объяснение и не смог найти хорошую информацию об использовании объектов Holder. – Apachi2K
Ничего, нашел пример, который объяснил это! – Apachi2K
Просто повторить. Держатель (или любое другое имя, которое вы решите дать) - это простой объект POJO (data), который содержит ссылки. В сложных ситуациях я обычно добавляю некоторое поведение к Holder, например, метод reset() – Bostone