0

我創建了一個ViewPager實現與FragmentStatePagerAdapter讓我的應用程序的用戶瀏覽和編輯潛在的大量記錄後,錯誤的內容。父活動的菜單包括一個刪除按鈕,它允許用戶刪除當前顯示的片段。片段包括準靜態(例如TextView)以及可直接編輯的數據(例如EditText)。數據在編輯時保存(爲簡潔起見,此處未顯示)。ViewPager顯示移除頁面

當我刪除的頁面現在會發生什麼情況是,下一個記錄顯示,這是預期。 TextView正確顯示,但當前頁面的EditText顯示已刪除頁面的相應值,並且下一頁的值取自錯誤記錄。

如何才能讓ViewPager正確顯示EditText視圖?

例如,與內容3卸下3頁之後,我得到如下:

enter image description here

下面是爲Activity的代碼中,FragmentStatePagerAdapterFragment

活動:

public class ViewPagerActivity extends AppCompatActivity { 

    private ViewPagerAdapter mViewPagerAdapter; 
    private ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_pager); 

     mViewPager = (ViewPager) findViewById(R.id.viewPager); 

     mViewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     mViewPager.setAdapter(mViewPagerAdapter); 
     mViewPager.setCurrentItem(0); 
    } 

    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 

     getMenuInflater().inflate(R.menu.menu_view_pager, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     super.onOptionsItemSelected(item); 

     switch (item.getItemId()) { 
      case R.id.action_delete: 
       deleteItem(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void deleteItem() { 
     mViewPagerAdapter.removeItem(this, mViewPager.getCurrentItem()); 
     if (mViewPagerAdapter.getCount() == 0) { 
      finish(); 
     } 
    } 
} 

適配器:

class ViewPagerAdapter extends FragmentStatePagerAdapter { 

    private List<PageContent> mPageContents; 

    ViewPagerAdapter(FragmentManager fm) { 
     super(fm); 
     mPageContents = new ArrayList<>(); 
     mPageContents.add(new PageContent("Page 1", "Detail 1")); 
     mPageContents.add(new PageContent("Page 2", "Detail 2")); 
     mPageContents.add(new PageContent("Page 3", "Detail 3")); 
     mPageContents.add(new PageContent("Page 4", "Detail 4")); 
     mPageContents.add(new PageContent("Page 5", "Detail 5")); 
     mPageContents.add(new PageContent("Page 6", "Detail 6")); 
    } 

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

    @Override 
    public int getItemPosition(Object object) { 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     PageContent pageContent = mPageContents.get(position); 
     return PagerFragment.newInstance(pageContent.getTitle(), pageContent.getDescription()); 
    } 

    void removeItem(AppCompatActivity activity, int position) { 
     mPageContents.remove(position); 
     notifyDataSetChanged(); 
     if (mPageContents.size() == 0) { 
      activity.finish(); 
     } 
    } 
} 


class PageContent { 

    private String mTitle; 
    String getTitle() { return mTitle; } 
    private String mDescription; 
    String getDescription() { return mDescription; } 

    PageContent(String title, String content) { 
     mTitle = title; 
     mDescription = content; 
    } 
} 

片段:

public class PagerFragment extends Fragment { 

    private String mTitle; 
    private String mDetail; 
    private static final String ARG_TITLE = "title"; 
    private static final String ARG_DETAIL = "detail"; 

    public PagerFragment() { } 

    public static PagerFragment newInstance(String title, String detail) { 
     PagerFragment fragment = new PagerFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_TITLE, title); 
     args.putString(ARG_DETAIL, detail); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

     mTitle = getArguments().getString(ARG_TITLE); 
     mDetail = getArguments().getString(ARG_DETAIL); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_pager, container, false); 

     TextView titleView = (TextView) view.findViewById(R.id.title); 
     EditText detailView = (EditText) view.findViewById(R.id.detail); 

     titleView.setText(mTitle); 
     detailView.setText(mDetail); 

     return view; 
    } 
} 

回答

1

嘗試調用setText方法onResume方法在您的PagerFragment。在這裏找到答案:https://stackoverflow.com/a/12987279/2121682。不知道爲什麼或者如何,但是當我在你的代碼上嘗試它時,它工作正常。

public class PagerFragment extends Fragment { 

    private String mTitle; 
    private String mDetail; 
    private static final String ARG_TITLE = "title"; 
    private static final String ARG_DETAIL = "detail"; 

    TextView titleView; 
    EditText detailView; 

    public PagerFragment() { 
    } 

    public static PagerFragment newInstance(String title, String detail) { 
     PagerFragment fragment = new PagerFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_TITLE, title); 
     args.putString(ARG_DETAIL, detail); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

     mTitle = getArguments().getString(ARG_TITLE); 
     mDetail = getArguments().getString(ARG_DETAIL); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.item_pager, container, false); 

     titleView = (TextView) view.findViewById(R.id.text); 
     detailView = (EditText) view.findViewById(R.id.edit); 

     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     titleView.setText(mTitle); 
     detailView.setText(mDetail); 
    } 
}