2012-10-10 37 views
6

Tôi đang sử dụng bộ điều hợp máy nhắn tin phân đoạn để khởi tạo lớp phân đoạn của mình. Tôi có thể làm như vậy nhưng vấn đề của tôi là phương thức getItem() của tôi được gọi hai lần là tạo ra vấn đề hơn nữa.can u giải thích cho tôi lý do tại sao nó đang xảy ra.phương thức getItem() được gọi hai lần khi sử dụng Bộ chuyển đổi phân trang Fragment

package com.creatiosoft.rssfeed.adaptor; 

    import android.content.Context; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 
    import android.util.Log; 

    import com.creatiosoft.rssfeed.utils.RssItem; 
    import com.viewpagerindicator.IconPagerAdapter; 

    public class NewsFeedsAdapter extends FragmentPagerAdapter implements 
      IconPagerAdapter { 

     int[] icon = null; 
     String[] content = null; 
     String[] URLs = null; 
     Context cont; 

     public NewsFeedsAdapter(FragmentManager fm, Context context) { 
      super(fm); 
      Log.i("jk", "constructor"); 
      this.cont = context; 
      RssItem newsFeedAppliaction = (RssItem) cont; 
      /* 
      * Retrieving the values of the Icons and contents from the application 
      * class in utils package 
      */ 
      icon = newsFeedAppliaction.getICONS(); 
      content = newsFeedAppliaction.getCONTENT(); 
      URLs = newsFeedAppliaction.getURL(); 

     } 

     /** instantiate a new fragment class */ 
     @Override 
     public Fragment getItem(int position) { 
      Log.i("yt", "hello" + position); 
      return TestFragment.newInstance(position % content.length, cont); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return content[position % content.length].toUpperCase(); 
     } 

     public int getIconResId(int index) { 
      return icon[index]; 
     } 

     /** return the no of views on the basis of array items */ 
     @Override 
     public int getCount() { 

      Log.i("hi", "length" + content.length); 
      return content.length; 
     } 
    }  

tôi kêu gọi Adapter với mã này:

NewsFeedsAdapter adapter = new NewsFeedsAdapter(
       getSupportFragmentManager(), getApplicationContext()); 
     /** 
     * get the id of the view pager declared in the xml resource and set the 
     * adaptor on the view pager 
     */ 
     ViewPager pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(adapter); 
     //pager.setCurrentItem(0); 

     /** 
     * Tab page indicator class is used to indicate the tabs and is accessed 
     * from the library class 
     */ 
     TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator); 
     indicator.setViewPager(pager); 

Trả lời

2

Trong phương pháp GetItem của bạn, bạn tạo một đối tượng mới của một đoạn. Thật là kinh khủng. Nó đặt bạn vào tình huống hiện tại của bạn. Những gì bạn đang làm là tạo ra một vật phẩm bất thường mới sẽ sống trong những ngày bạn đã chỉ định. Nhưng khi hệ thống Android độc ác quyết định đó là cần phải nói chuyện với mảnh vỡ của bạn một lần nữa và yêu cầu nó từ bộ chuyển đổi của bạn, bạn đang nói với nó "Không. Tôi không muốn!" và thay vào đó cho nó một mảnh mới CHÍNH XÁC giống như rother cũ của nó.

Để khắc phục điều này, bạn thổi phồng tất cả đoạn của bạn trước thời hạn và sau đó trả lại đoạn thích hợp. Hoặc nếu bạn thích, đừng. Nhưng giữ một bản ghi các trường hợp bạn đã tạo để bạn có thể trả về các mảnh đã tạo.

Tôi không biết chính xác lý do tại sao nó được gọi hai lần - tôi đã không xóa nguồn của v4, nhưng có thể được thực hiện để đảm bảo rằng mục đó thực sự được truy xuất hoặc hệ thống đã nhập trạng thái mà mục trước đó cần được giới thiệu.

Kết luận, giữ lại các phiên bản đã tạo - đặc biệt là cho đối tượng nặng như mảnh, lượt xem và hoạt động.

class Adapter extends MyWhateverAdapter { 
    Fragment[] myLovelyFragments; 

    public Adapter() { 
     // Instantiate your fragments and place them into myLovelyFragments 
    } 

    public int getFragmentCount() { 
     return myLovelyFragments.length; 
    } 

    public Fragment getItem(int position) { 
     return myLovelyFragments[position]; 
    } 
} 
+0

vui lòng cung cấp cho tôi mã mẫu nếu có thể. – yokees

+0

@ Rishabh.CreatioSoft Có bạn đi. :) – AedonEtLIRA

+0

nhưng cho tôi biết một vị trí điều trả về cho tôi 0 & 1 cả trong getItem khi PagerAdapterCall.Vì vậy, chúng tôi đang nhận được đối tượng mảnh trên 1 vị trí. Làm thế nào bạn có thể nói mã của bạn chúng tôi chính xác. – yokees

11

Lưu ý rằng máy nhắn tin lưu giữ ít nhất một trang trước. Có nghĩa là khi máy nhắn tin được tạo, anh ấy tạo ít nhất hai trang - trang anh ấy hiển thị và trang tiếp theo, để cho phép "phân trang".

0

Sự cố mà bạn có thể có không phải là nhiều cuộc gọi của phương thức getItem(). Sau một ít nghiên cứu, tôi thấy rằng phương pháp isViewFromObject() có một vai trò rất lớn và trong tài liệu hướng dẫn của nó người ta nói rằng "This method is required for a PagerAdapter to function properly."

Tôi cũng thấy rằng đúng cách để thực hiện phương pháp này là:

@Override 
public boolean isViewFromObject(View view, Object object) { 
    if(object != null){ 
     return ((Fragment)object).getView() == view; 
    }else{ 
     return false; 
    } 
} 

Bạn có thể xem here.

Các vấn đề liên quan