0

已解決(我只需要將FragmentPagerAdapter更改爲FragmentStatePagerAdapter,因爲最後一個保存了屏幕中不可見的片段的狀態,所以GridView的大小不斷增加。 ,這是不可見的,內存,信息可能泄漏,活動可能會被破壞,這是GridView發生的情況(下面的問題)添加FragmentStatePagerAdapter將保存片段的狀態,當它再次變爲可見時當PageAdapter(Android)

我是開發一個在線購物應用程序由於我必須展示大量的產品,我使用了很多分類,我使用的一個主要功能是帶有PageAdapter的ViewPager,在每個片段中它應該是不同的l ayouts。在其中一個片段中,我使用了一個GridView。問題是,當我在頁面之間切換時,我回到第一頁GridView的大小,內部元素的數量不斷增加。例如,如果我有12種元素的開頭,以後我切換頁面,然後回來再變成24,36等

下面是我用這個代碼: EbuyHomeScreen.class

public class EbuyHomeScreen extends FragmentActivity { 

     @SuppressLint("InlinedApi") protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.ebuy_home_screen); 

      /** Getting a reference to the ViewPager defined the layout file */   
      ViewPager pager = (ViewPager) findViewById(R.id.pager); 

      /** Getting fragment manager */ 
      FragmentManager fm = getSupportFragmentManager(); 

      /** Instantiating FragmentPagerAdapter */ 
      EbuyFragmentPagerAdapter pagerAdapter = new EbuyFragmentPagerAdapter(fm); 

      /** Setting the pagerAdapter to the pager object */ 
      pager.setAdapter(pagerAdapter); 
     } 

EbuyFragmentPagerAdapter

public class EbuyFragmentPagerAdapter extends FragmentStatePagerAdapter{ 

     final int PAGE_COUNT = 3; 

     /** Constructor of the class */ 
     public EbuyFragmentPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     /** This method will be invoked when a page is requested to create */ 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 

      case 0: 
       EbuyFragmentLatest myFragmentLatest = new EbuyFragmentLatest(); 
       return myFragmentLatest; 

      case 1: 

       EbuyFragmentSold myFragmentSold = new EbuyFragmentSold(); 
       return myFragmentSold; 

      case 2: 
       EbuyFragmentSponsored myFragmentSponsored = new EbuyFragmentSponsored(); 
       return myFragmentSponsored; 

      default: 

       EbuyFragmentLatest myFragmentLatestDefault = new EbuyFragmentLatest(); 
       return myFragmentLatestDefault; 
      } 

     } 

     /** Returns the number of pages */ 
     @Override 
     public int getCount() { 
      return PAGE_COUNT; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      /** code for returning the title*/  } 
     } 

    } 

EbuyFragmentLatest

public class EbuyFragmentLatest extends Fragment { 

     final ArrayList<EbuyItem> ebuy_data = new ArrayList<EbuyItem>(); 
     private EbuyItemAdapter customAdapter; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.ebuy_home_fragment_latest, 
        container, false); 
      JazzyGridView mGrid = (JazzyGridView)v.findViewById(R.id.ebuy_list); 
      mGrid.setTransitionEffect(JazzyHelper.TILT); 

      ebuy_data.add(new EbuyItem("http://www.ebuy.al/Images/dsc/8884_400_300.jpg","Fustan Glamour","2,500L [17.9 €]")); 
      /* 
       ** filing with data continues */ 

      customAdapter = new EbuyItemAdapter(
        container.getContext(), ebuy_data); 
        mGrid.setAdapter(customAdapter); 
      return v; 
     } 
    } 

EbuyItemAdapter

public class EbuyItemAdapter extends BaseAdapter { 

    private ArrayList<EbuyItem> ebuy_data; 

    private LayoutInflater layoutInflater; 

    public EbuyItemAdapter(Context context, ArrayList<EbuyItem> ebuy_data) { 
     this.ebuy_data = ebuy_data; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return ebuy_data.size(); 
    } 

    public Object getItem(int position) { 
     return ebuy_data.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @SuppressLint({ "DefaultLocale", "InflateParams" }) 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.ebuy_item, null); 
      holder = new ViewHolder(); 
      holder.name = (TextView) convertView.findViewById(R.id.name); 
      holder.price = (TextView) convertView.findViewById(R.id.price); 
      holder.image = (ImageView) convertView 
        .findViewById(R.id.ebuy_image); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.name.setText(((EbuyItem) ebuy_data.get(position)).getName()); 
     holder.price.setText(((EbuyItem) ebuy_data.get(position)).getPrice()); 
     UrlImageViewHelper.setUrlDrawable(holder.image, 
       ((EbuyItem) ebuy_data.get(position)).getImageUrl(), 
       R.drawable.loading); 

     return convertView; 
    } 

    static class ViewHolder { 

     TextView name; 
     TextView price; 
     ImageView image; 
    } 

}

回答

0

解決(我只需要監守最後一個保存,是不是在屏幕上可見一個片段的狀態從FragmentPagerAdapter更改爲FragmentStatePagerAdapter。所以當你需要很多不可見的片段時,內存,信息可能會泄漏,活動可能會被破壞。這是GridView發生的情況。添加FragmentStatePagerAdapter將在片段再次變爲可見時保存片段的狀態。

所以才改變這一行:

public class EbuyFragmentPagerAdapter extends FragmentPagerAdapter 

public class EbuyFragmentPagerAdapter extends FragmentStatePagerAdapter