滚动gridview时重复调用Gridview第一个位置

Posted

技术标签:

【中文标题】滚动gridview时重复调用Gridview第一个位置【英文标题】:Gridview first position called repeatedly when scroll gridview 【发布时间】:2019-02-02 11:15:27 【问题描述】:

我想知道为什么即使我设置了适配器,当我滚动 gridview 时,第一个位置的视图也会被重复调用。这导致我的 gridview 在反复重新加载图像时无法平滑滚动。

似乎Picasso.with(context).load(file).into(viewImage);导致重复调用,因为如果我删除这一行,gridview可以平滑滚动。

有什么改进的建议吗?谢谢。

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】:

始终尝试将ViewHolder 模式用于列表和网格。这将提高列表和网格的性能。其他人认为它不仅取决于Picasso,还取决于您的图片网址、您在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;

其他想法是尝试从现金加载您的图像,如果它以前在您使用毕加索时加载。为此检查此tutorial。

【讨论】:

以上是关于滚动gridview时重复调用Gridview第一个位置的主要内容,如果未能解决你的问题,请参考以下文章

带有修复标题的可滚动 Gridview [重复]

很急GridView固定表头和指定列

滚动时修复gridview标题

Gridview背景颜色在Android中滚动时改变颜色

GridView的滚动速度在停止时很慢

如何在运行时在垂直可滚动页面内动态创建水平可滚动 Gridview