Android中网格视图中的图像顺序

Android中网格视图中的图像顺序,android,android-imageview,image-gallery,android-gallery,android-gridview,Android,Android Imageview,Image Gallery,Android Gallery,Android Gridview,我有一个android应用程序,其中有一个网格视图库。在这个网格视图中,当用户单击图像时,我会全屏显示图像。它工作得很好。但问题是,当图像第一次出现在屏幕上时,“网格视图”会正确显示图像,但当用户向下滚动以查看更多图像时,顺序会随机改变。下面是我的适配器代码,您可以查看图片 public class GridGallery extends BaseAdapter { Context context; public GridGallery(Context context

我有一个android应用程序,其中有一个网格视图库。在这个网格视图中,当用户单击图像时,我会全屏显示图像。它工作得很好。但问题是,当图像第一次出现在屏幕上时,“网格视图”会正确显示图像,但当用户向下滚动以查看更多图像时,顺序会随机改变。下面是我的适配器代码,您可以查看图片

    public class GridGallery extends BaseAdapter {

    Context context;

    public GridGallery(Context context) {
        this.context = context;
    }

    @Override
    public int getCount() {
        return urlList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        System.gc();

        ImageView view;

        if(convertView == null) {

            view = new ImageView(context);

            view.setScaleType(ImageView.ScaleType.FIT_CENTER);
            view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
            view.setAdjustViewBounds(false);
            view.setPadding(2, 2, 2, 2);

            imageLoader.DisplayImage(urlList.get(position), view);

            System.gc();

        }else {
            view = (ImageView) convertView;
        }

        System.gc();

        return view;
    }

}
下面是我如何设置适配器的

GridView g = (GridView) findViewById(R.id.myGrid);
        g.setAdapter(new GridGallery(context));

        isGalleryVisible = false;

        g.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                myPagerAdapter = new MyPagerAdapter(context);
                pager = (ViewPager) findViewById(R.id.gallery_view);
                pager.setAdapter(myPagerAdapter);
                pager.setCurrentItem(position);

                isGalleryVisible = true;

            }
        });
GridView g=(GridView)findviewbyd(R.id.myGrid);
g、 setAdapter(新GridGallery(上下文));
isGalleryVisible=false;
g、 setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
myPagerAdapter=新的myPagerAdapter(上下文);
pager=(ViewPager)findViewById(R.id.gallery\u视图);
寻呼机设置适配器(myPagerAdapter);
pager.setCurrentItem(位置);
isGalleryVisible=true;
}
});
这是我的屏幕截图,当我滚动它时,它会自动重复。每次我向下滚动并返回顶部时,它们的位置都会随机变化

任何帮助都将不胜感激。提前谢谢


是的,我现在也面临同样的问题。我也在使用Fedor的延迟加载概念。我不确定这会有多大帮助,以及这是否是正确的方法。但它还是解决了我的问题

我不得不在getView()中做一些修改,

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

        System.gc();

        ImageView view;

        if(convertView == null) {

            view = new ImageView(context);

            view.setScaleType(ImageView.ScaleType.FIT_CENTER);
            view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
            view.setAdjustViewBounds(false);
            view.setPadding(2, 2, 2, 2);



            System.gc();

        }else {
            view = (ImageView) convertView;
        }
          if(view!=null)
            {
                   imageLoader.DisplayImage(urlList.get(position), view);
                   notifyDataSetChanged();  //Calling this helped to solve the problem. 
            }

        System.gc();

        return view;
    }

是的,我现在也面临同样的问题。我也在使用Fedor的延迟加载概念。我不确定这会有多大帮助,以及这是否是正确的方法。但它还是解决了我的问题

我不得不在getView()中做一些修改,

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

        System.gc();

        ImageView view;

        if(convertView == null) {

            view = new ImageView(context);

            view.setScaleType(ImageView.ScaleType.FIT_CENTER);
            view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
            view.setAdjustViewBounds(false);
            view.setPadding(2, 2, 2, 2);



            System.gc();

        }else {
            view = (ImageView) convertView;
        }
          if(view!=null)
            {
                   imageLoader.DisplayImage(urlList.get(position), view);
                   notifyDataSetChanged();  //Calling this helped to solve the problem. 
            }

        System.gc();

        return view;
    }

我刚刚删除了

if(convertView==null)
它能工作

我刚刚删除了

if(convertView==null)
它起作用了

谢谢你,伙计,接受了你的答案。我想问一些与此相关的其他问题,此网格视图非常慢,您的视图是否相同?你知道我怎样才能使它更快吗?我不确定。但当我尝试使用高分辨率图像时,我遇到了一个问题。尝试缩放它。不管怎样,BCoz网格的宽度和高度都很小,为什么要使用大图像。我实际上使用的是小图像,我发现了问题所在。这是因为垃圾收集。由于Fedor的延迟加载使用的是弱引用,因此调用System.gc()会杀死内存缓存。这就是为什么适配器在我每次滚动时都试图创建它们的原因。但现在我遇到了另一个问题,我尝试了您的方法,效果非常好。但问题是,如果完全向下滚动一次,而当我向上滚动时,我的点击项目事件不起作用。你知道吗?谢谢,伙计,接受了你的答案。我想问一些与此相关的其他问题,此网格视图非常慢,您的视图是否相同?你知道我怎样才能使它更快吗?我不确定。但当我尝试使用高分辨率图像时,我遇到了一个问题。尝试缩放它。不管怎样,BCoz网格的宽度和高度都很小,为什么要使用大图像。我实际上使用的是小图像,我发现了问题所在。这是因为垃圾收集。由于Fedor的延迟加载使用的是弱引用,因此调用System.gc()会杀死内存缓存。这就是为什么适配器在我每次滚动时都试图创建它们的原因。但现在我遇到了另一个问题,我尝试了您的方法,效果非常好。但问题是,如果完全向下滚动一次,而当我向上滚动时,我的点击项目事件不起作用。你知道吗?