0

Решено (мне просто нужно было изменить с FragmentPagerAdapter на FragmentStatePagerAdapter, потому что последний сохраняет состояния фрагмента, который не отображается на экране. Поэтому, когда у вас есть много фрагментов , которые не видны, память может течь, а активность может быть уничтожена. Это то, что произошло с GridView (проблема ниже). Добавление FragmentStatePagerAdapter сохранит состояние фрагмента, когда оно снова станет видимым.Размер GridView продолжает расти, когда PageAdapter (Android)

Я разрабатывая приложение для онлайн-шоппинга. Из-за большого количества продуктов, которые я должен отображать, я использовал много категоризации. Одной из основных функций, которые я использую, является ViewPager с PageAdapter. В каждом фрагменте он должен быть разные 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 becuase последний сохраняет состояния фрагмента, который не виден на экране. Поэтому, когда у вас есть много фрагментов, которые не видны, память, информация может течь, а деятельность может быть уничтожена. Это то, что произошло с GridView. Добавление FragmentStatePagerAdapter сохранит состояние фрагмента, когда оно снова станет видимым.

Так просто изменить эту строку:

public class EbuyFragmentPagerAdapter extends FragmentPagerAdapter 

к

public class EbuyFragmentPagerAdapter extends FragmentStatePagerAdapter 
Смежные вопросы