우선 제가 만들고 있는 어플리케이션은 학교앱이고 네비게이션 드로어와 앱바가 있는 액티비티를 큰 틀로 하고 그 안쪽에 프래그먼트를 바꿔가는 방식으로 하였습니다. 프래그먼트는 일단 세개를 사용하고 있습니다. (A,B,C라고 부르겠습니다.)
그 중 B프래그먼트는 db파일에서 들고온 학교시간표를 보여주는데요, 이 B프래그먼트는 작은 앱바(안에 tablayout 있음)와 뷰페이저, 그리고 플로팅 액션 버튼을 가지고 있습니다. 뷰페이저는 어댑터를 사용해 안에 다섯개의 프래그먼트를 가지며 이 프래그먼트들은 작은 앱바의 tablayout(드래그 가능)으로 넘길 수 있는 구조입니다. 참고로 탭은 월요일~금요일로 되있고 작은 프래그먼트들은 각각 7개의 과목을 리사이클러 뷰로 보여주는 형태입니다.
여기서 문제가 발생하는데, 앱을 켠 뒤 B프래그먼트를 처음 생성하면 뷰페이저 안의 작은 프래그먼트들이 모두 제대로 생성됩니다. 근데, A혹은 C프래그먼트를 불렀다가 B프래그먼트를 다시 열면 뷰페이저 안의 작은 프래그먼트들이 제대로 생성되지 않습니다. 어떨 때는 모두 생성되기도 하고, 어떨 때는 한개만 생성되거나 세개, 혹은 아예 아무것도 생성되지 않을 때도 있습니다. 이럴 때 탭을 이리저리 넘기면서 다시 확인해보면 작은 프래그먼트가 하나씩 생성되기도 합니다.
그래서 제가 알고 싶은 것은 B프래그먼트를 한번 만들고 A혹은 C프래그먼트를 연뒤 다시 B프래그먼트를 열 때 어떻게하면 뷰페이저 안에서 생성되는 작은 프래그먼트들이 완전히 생성되는지입니다.
코드는 아래에 적겠습니다.
//시간표 프래그먼트입니다.
public class TimeTableFragment extends Fragment {
SharedPreferences setting;
ViewPager viewPager;
public TimeTableFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_timetable, container, false);
viewPager = (ViewPager) view.findViewById(R.id.mViewpager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) view.findViewById(R.id.mTabLayout);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setSelectedTabIndicatorColor(Color.WHITE);
setCurrentItem();
return view;
}
private void setCurrentItem() {
Calendar calendar = Calendar.getInstance();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek > 1 && dayOfWeek < 7) {
viewPager.setCurrentItem(dayOfWeek - 2);
} else {
viewPager.setCurrentItem(0);
}
}
private void setupViewPager(ViewPager viewPager) {
setting = PreferenceManager.getDefaultSharedPreferences(getActivity());
String Grade = setting.getString("timeTable_grade", "-1");
String Class = setting.getString("timeTable_class", "-1");
int mGrade = Integer.parseInt(Grade);
int mClass = Integer.parseInt(Class);
Adapter mAdapter = new Adapter(getFragmentManager());
for (int dayOfWeek = 0; dayOfWeek < 5; dayOfWeek++) {
mAdapter.addFragment(TimeTableTool.mDisplayName[dayOfWeek], TimeTableRecycler.getInstance(mGrade, mClass, dayOfWeek));
}
viewPager.setAdapter(mAdapter);
}
class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public Adapter(FragmentManager manager) {
super(manager);
}
public void addFragment(String mTitle, Fragment mFragment) {
mFragments.add(mFragment);
mFragmentTitles.add(mTitle);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
}
//리사이클러 뷰에 카드 뷰에 담은 형태로 시간표를 뿌려줍니다.
public class TimeTableAdapter extends RecyclerView.Adapter<TimeTableAdapter.TimeTableViewHolder> {
private ArrayList<TimeTableInfo> mValues = new ArrayList<>();
public TimeTableAdapter(Context mContext) {
}
public void addItem(int time, String name) {
TimeTableInfo addInfo = new TimeTableInfo();
addInfo.time = time;
addInfo.name = name;
mValues.add(addInfo);
}
@Override
public TimeTableAdapter.TimeTableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_timetable_item, parent, false);
return new TimeTableViewHolder(mView);
}
@Override
public void onBindViewHolder(final TimeTableViewHolder holder, int position) {
TimeTableInfo mInfo = getItemData(position);
holder.mTimeText.setText(String.valueOf(mInfo.time));
holder.mTimeName.setText(mInfo.name);
}
@Override
public int getItemCount() {
return mValues.size();
}
public TimeTableInfo getItemData(int position) {
return mValues.get(position);
}
public class TimeTableViewHolder extends RecyclerView.ViewHolder {
public final TextView mTimeText, mTimeName;
public TimeTableViewHolder(View mView) {
super(mView);
mTimeText = (TextView) mView.findViewById(R.id.mTimeText);
mTimeName = (TextView) mView.findViewById(R.id.mTimeName);
}
}
public class TimeTableInfo {
public int time;
public String name;
}
}
//리사이클러 뷰
public class TimeTableRecycler extends Fragment {
public static Fragment getInstance(int mGrade, int mClass, int dayOfWeek) {
TimeTableRecycler mFragment = new TimeTableRecycler();
Bundle args = new Bundle();
args.putInt("mGrade", mGrade);
args.putInt("mClass", mClass);
args.putInt("dayOfWeek", dayOfWeek);
mFragment.setArguments(args);
return mFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.recyclerview, container, false);
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
final TimeTableAdapter mAdapter = new TimeTableAdapter(getActivity());
recyclerView.setAdapter(mAdapter);
Bundle args = getArguments();
int mGrade = args.getInt("mGrade");
int mClass = args.getInt("mClass");
int dayOfWeek = args.getInt("dayOfWeek");
TimeTableTool.timeTableData mData = TimeTableTool.getTimeTableData(mGrade, mClass, dayOfWeek);
for (int position = 0; position < 7; position++) {
mAdapter.addItem(position + 1, mData.subject[position]);
}
return recyclerView;
}
}
제발 부탁드립니다... ㅠㅠ