마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

프래그먼트안에서 뷰페이져에서 다시 프래그먼트 사용시(?) 질문입니다.

0 추천

우선 제가 만들고 있는 어플리케이션은 학교앱이고 네비게이션 드로어와 앱바가 있는 액티비티를 큰 틀로 하고 그 안쪽에 프래그먼트를 바꿔가는 방식으로 하였습니다. 프래그먼트는 일단 세개를 사용하고 있습니다. (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;
    }
}

 

 

제발 부탁드립니다... ㅠㅠ

고딩학생 님이 2017년 1월 13일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...