Gridview первая позиция вызывается повторно при прокрутке gridview - PullRequest
0 голосов
/ 28 августа 2018

Мне интересно, почему представление в первой позиции неоднократно вызывается, когда я прокручиваю вид сетки, даже когда я установил адаптер. Это приводит к невозможности плавной прокрутки моего вида сетки, так как он многократно перезагружает изображение.

Кажется, Picasso.with(context).load(file).into(viewImage); вызывает повторные вызовы, потому что, если я удаляю эту строку, просмотр сетки можно плавно прокручивать.

Есть предложения по улучшению? Спасибо.

Реализация для адаптера массива gridview

class HomeBrandCVC extends ArrayAdapter<Brand> {

private Context context;
private ArrayList<Brand> brandArrayList;
private Map<Integer, File> fileMap = new HashMap<>();

public HomeBrandCVC(Context c, ArrayList<Brand> brandArrayList) {
    super(c, R.layout.homecvc, brandArrayList);
    this.context = c;
    this.brandArrayList = brandArrayList;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View rowView = inflater.inflate(R.layout.homecvc, parent, false);
    TextView nameLabel = (TextView) rowView.findViewById(R.id.homecvc_nameLabel);
    nameLabel.setVisibility(View.INVISIBLE);
    final Brand brand = brandArrayList.get(position);
    nameLabel.setText(brand.name);
    ImageView viewImage = (ImageView) rowView.findViewById(R.id.homecvc_viewImage);

    Log.d("hellllo", String.valueOf(position));

    if (fileMap.containsKey(position)) {
        viewImage.setImageBitmap(BitmapFactory.decodeFile(fileMap.get(position).getAbsolutePath()));
    } else {
        viewImage.setImageResource(R.drawable.loadingimage);
        new MyLeanCloudApp.GetImageFromDiskOrUrl(brand.imageFile, new MyLeanCloudApp.ImageHandlerGetImagesResponse() {
            @Override
            public void processFinish(File file) {
                if (context != null) {
                    if (file != null) {
                        Picasso.with(context).load(file).into(viewImage);
                        fileMap.put(position, file);
                    }
                }
            }
        }).execute();
    }
    return rowView;
}
}

1 Ответ

0 голосов
/ 05 сентября 2018

Всегда старайтесь использовать ViewHolder Шаблон для списков и балок. Это улучшит производительность списков и сеток. Другие думают, что он зависит не только от Пикассо , но также от URL вашего изображения, вашего файла макета XML, загрузки данных и т. Д.

Попробуйте использовать ViewHolder, чтобы избежать проблемы с прокруткой и улучшить ее производительность

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

    ViewHolder viewHolder = null;
    if(convertView==null){
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.grid_item,parent,false);

        convertView.setTag(viewHolder);
    }
    else {
        viewHolder=(ViewHolder)convertView.getTag();
    }
    viewHolder.image=(ImageView)convertView.findViewById(R.id.thumbnail);
    viewHolder.title=(TextView)convertView.findViewById(R.id.title);
    viewHolder.title.setText(Html.fromHtml(values.getPosts().get(position).getTitle()));

    imageView.setImageResource(Imageid[position]);
    return convertView;
}

private static class ViewHolder{
    public static ImageView image;
    public static TextView title;
}

Другая мысль - попытаться загрузить свое изображение из наличных, если оно было загружено ранее, когда вы используете Picasso. Для этого проверьте этот учебник .

...