0

我有一個android應用程序,它有一個網格視圖庫。在此網格視圖中,當用戶單擊圖像時,我將全屏顯示圖像。它工作得很好。但問題是網格視圖會在第一次顯示圖像時正確顯示圖像,但當用戶向下滾動以查看更多圖像時,順序會隨機更改。這是我的代碼下面的適配器,你可以看看圖片。Android中Grid View中圖像的順序

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; 

      } 
     }); 

這裏是我的屏幕截圖,它重演,當我把它的滾動。每當我向下滾動並返回頂部時,他們的位置都會隨機變化。

任何幫助將不勝感激。提前致謝。

回答

3

啊,我只是遇到了同樣的問題現在。我也在使用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; 
    } 
+0

感謝的人,接受你的解答的答案。我想問一些與此相關的其他內容,這個網格視圖很慢,是不是也一樣?你知道我該如何加快速度? – osayilgan

+0

我不確定。但是當我嘗試使用巨大分辨率的圖像時,我遇到了一個問題。嘗試縮放它。無論如何,BCoz網格會有很小的寬度和高度,爲什麼要使用巨大的圖像。 –

+2

實際上我使用的是小圖片,而我發現了這個問題。這是因爲垃圾收集。由於Fedor的延遲加載使用弱引用,調用System.gc()會殺死內存緩存。這就是爲什麼Adapter每次滾動時都試圖創建它們的原因。 – osayilgan

0

我剛纔刪除的

如果(convertView == NULL) 它的工作原理