7

Tôi biết có một số chủ đề về điều này ở đây nhưng tôi không thể tìm thấy một giải pháp mà tôi có thể làm việc cho trường hợp của mình.Làm thế nào để loại bỏ Fragment từ FragmentPagerAdapter?

Tôi có thư viện trượt hoạt động bằng cách sử dụng tùy chỉnh FragmentActivityFragmentPagerAdapter chứa danh sách Phân đoạn.

Trong phạm vi FragmentActivityImageView "xóa". Nếu được nhấp, hàm deleteMedia() được gọi là sau đó sẽ xóa số Fragment hiện tại và Fragment sau sẽ được hiển thị. Tôi phải làm như thế nào trong ví dụ của mình?

FragmentActivity:

public class GalleryPagerActivity extends FragmentActivity implements OnClickListener { 

    private Intent intent; 
    private SharedPreferences settings; 
    private PagerAdapter mPagerAdapter; 
    private ViewPager mPager; 
    private List<Fragment> fragments; 
    private List<WhiteboardMedia> wiList; 

    private int selectedPosition; 
    private LinearLayout llTop; 
    private TextView tvTop; 
    private ImageView delete; 
    private ImageView share; 
    private TextView tvCounter; 
    private TextView tvFilename; 
    private TextView tvFilesize; 
    private TextView tvDate; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      super.setContentView(R.layout.gallery_pager); 

      intent = getIntent(); 

      Type collectionType = new TypeToken<List<WhiteboardMedia>>(){}.getType(); 

      wiList = gson.fromJson(intent.getStringExtra("wiList"), collectionType); 
      selectedPosition = intent.getIntExtra("position", 1); 

      llTop = (LinearLayout) findViewById(R.id.llTop); 
      llTop.setOnClickListener(this); 
      tvTop = (TextView) findViewById(R.id.tvTop); 
      tvTop.setOnClickListener(this); 
      delete = (ImageView) findViewById(R.id.imgDelete); 
      delete.setOnClickListener(this); 
      share = (ImageView) findViewById(R.id.imgShare); 
      share.setOnClickListener(this); 

      tvCounter = (TextView) findViewById(R.id.tvCounter); 
      tvFilename = (TextView) findViewById(R.id.tvFilename); 
      tvFilesize = (TextView) findViewById(R.id.tvFilesize); 
      tvDate = (TextView) findViewById(R.id.tvDate); 

      createContextMenu(); 
      initDropbox(); 
     } catch (Exception e) { 
      Log.e("GalleryPagerActivity", e.getLocalizedMessage()); 
     } 
    } 

    /** 
    * Initialise the pager 
    */ 
    private void initialisePager() { 
     mPager = (ViewPager) super.findViewById(R.id.viewpager); 
     mPager.setAdapter(this.mPagerAdapter); 
     mPager.setOnPageChangeListener(new GalleryPageListener(tvCounter, tvFilename, tvFilesize, tvDate, wiList)); 

     mPager.setCurrentItem(selectedPosition, true); 
     updatePage(selectedPosition); 
    } 

    public void updatePage(int position) 
    { 
     int focusedPage = position + 1; 
     Log.i("onPageSelected", "page selected " + position); 

     WhiteboardMedia wiImage = wiList.get(position); 

     String imageDate = "N/A"; 
     try { 
      Date dateTaken= new Date(); //wiImage.getDate(); 
      SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd"); 
      imageDate = sdf.format(dateTaken); 
     } catch (Exception e) { 
     } 

     try { 
      tvCounter.setText(focusedPage + "/" + wiList.size()); 
      tvFilename.setText(wiImage.getFilename()); 
      tvFilesize.setText(wiImage.getSize() + "a"); 
      tvDate.setText(imageDate); 
     } catch (Exception e) { 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    private WhiteboardMedia getActiveWhiteboardImage() { 
     return wiList.get(mPager.getCurrentItem()); 
    } 

    private final int DELETE = 1; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     menu.add(1, DELETE, 2, R.string.delete).setIcon(R.drawable.menu_btn_trash); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case DELETE: 
      deleteMedia(); 
      return true; 
     } 
     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == delete) { 
      deleteMedia(); 
     } 
    } 

    private void deleteMedia() { 
     // TODO delete the active Fragment and display the next Fragment in the list 
    } 

    /****************************************************************************** 
    * Context Menu 
    *****************************************************************************/ 
    private void createContextMenu() { 
     // context menu stuff 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     // stuff 
    } 

} 

FragmentPagerAdapter:

public class GalleryPagerAdapter extends FragmentPagerAdapter { 

private final List<Fragment> fragments; 

public GalleryPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 

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

Nhờ sự giúp đỡ!

Trả lời

11

Trước tiên, tôi khuyên bạn nên xem xét sửa đổi FragmentPagerAdapter của mình để trông giống như the sample. Bạn thường không giữ một danh sách các mảnh, bất kỳ số nào nhiều hơn một số ArrayAdapter thường chứa danh sách Views cho các hàng. Thông thường, bạn tạo ra các mảnh theo yêu cầu, và ai đó khác giữ danh sách.

Sau đó, để xóa nội dung nào đó, hãy xóa nội dung đó khỏi dữ liệu mô hình của bạn (những gì FragmentPagerAdapter thường kết thúc tốt đẹp). Đảm bảo rằng getCount() sau đó sẽ trả lại đúng số lượng mục. Sau đó, gọi số notifyDataSetChanged() trên số FragmentPagerAdapter, sẽ kích hoạt vẽ lại ViewPager.

+0

OK cảm ơn cho đến nay! Đang cố gắng lấy mã của tôi như trong ví dụ. Trong mã của tôi, tôi đi qua một danh sách đối tượng và điền vào danh sách phân đoạn với các mảnh thích hợp (hình ảnh, âm thanh, video). 'for (int i = 0; i

+1

@ user753827: 'getItem()' sẽ cần phải có các thông minh để trả về phân đoạn đúng. – CommonsWare

+2

Ugh, tôi đã có cùng một vấn đề với lứa tuổi. Các mảnh không được thu thập và ở đó một cách trực quan (ở vị trí cũ và sai của chúng) cho đến khi tôi di chuyển quá xa phải/trái và hệ thống culls chúng và resyncs. Bất kỳ ý tưởng những gì tôi đang làm sai? Mã của tôi trông khá giống ví dụ. –

15

đó là giải pháp tôi đang sử dụng:

mViewPager: là xem bạn đang sử dụng để thiết lập bạn Fragment

mViewPager = (YourViewPager) findViewById(R.id.myPager); 

TABLE: chỉ là một danh sách Integer của vị trí của tất cả các mảnh vỡ của tôi

public void destroyAllItem() { 
     int mPosition = mViewPager.getCurrentItem(); 
     int mPositionMax = mViewPager.getCurrentItem()+1; 
     if (TABLE.size() > 0 && mPosition < TABLE.size()) { 
      if (mPosition > 0) { 
       mPosition--; 
      } 

      for (int i = mPosition; i < mPositionMax; i++) { 
       try { 
        Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue()); 
        if (objectobject != null) 
         destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject); 
       } catch (Exception e) { 
        Log.i(TAG, "no more Fragment in FragmentPagerAdapter"); 
       } 
      } 
     } 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 

     if (position <= getCount()) { 
      FragmentManager manager = ((Fragment) object).getFragmentManager(); 
      FragmentTransaction trans = manager.beginTransaction(); 
      trans.remove((Fragment) object); 
      trans.commit(); 
     } 
    } 
+0

Điều này làm việc cho tôi, cảm ơn! –

+0

Perfect Douarbou! Cảm ơn ! – anthony

+0

Hoạt động như sự quyến rũ! Đã lưu Thời gian của tôi! Cảm ơn bạn :) –

1

Tôi tìm thấy giải pháp ovverriding phương thức "onPostResume()" của hoạt động và gọi notifyDataSetChanged bên trong đó.

@Override 
protected void onPostResume() { 
    super.onPostResume(); 
    if(this.mCustomPagerAdapter!=null){ 
     this.mCustomPagerAdapter.notifyDataSetChanged(); 
    } 
} 
Các vấn đề liên quan