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

fragment 에 recyclerView 질문좀 드리겠습니다..ㅠ

0 추천

안녕하세요, 최대한 직접 구글링 해보고 알아내보려고 노력해봤지만

도무지 감을 못잡겠어서 질문드리게됐습니다..ㅠ

 

위 사진처럼 뷰페이저 총 3개 안에 리싸이클러뷰를 넣을 계획입니다.

public class Pager1 extends AppCompatActivity {
    private RecyclerView recyclerView;

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

    }


    private void setUpRecyclerView() {
        recyclerView = findViewById(R.id.recycler_viewa);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
    }

    private void populateRecyclerView() {
        final ArrayList<YoutubeVideoModel> youtubeVideoModelArrayList = generateDummyVideoList();
        YoutubeVideoAdapter adapter = new YoutubeVideoAdapter(this, youtubeVideoModelArrayList);
        recyclerView.setAdapter(adapter);

        //set click event
        recyclerView.addOnItemTouchListener(new RecyclerViewOnClickListener(this, new RecyclerViewOnClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {

                
                startActivity(new Intent(Pager1.this, YoutubePlayerActivity.class)
                        .putExtra("video_id", youtubeVideoModelArrayList.get(position).getVideoId()));

            }
        }));
    }


    private ArrayList<YoutubeVideoModel> generateDummyVideoList() {
        ArrayList<YoutubeVideoModel> youtubeVideoModelArrayList = new ArrayList<>();


        String[] videoIDArray = getResources().getStringArray(R.array.video_id_array);
        String[] videoTitleArray = getResources().getStringArray(R.array.video_title_array);
        String[] videoDurationArray = getResources().getStringArray(R.array.video_duration_array);

        
        for (int i = 0; i < videoIDArray.length; i++) {

            YoutubeVideoModel youtubeVideoModel = new YoutubeVideoModel();
            youtubeVideoModel.setVideoId(videoIDArray[i]);
            youtubeVideoModel.setTitle(videoTitleArray[i]);
            youtubeVideoModel.setDuration(videoDurationArray[i]);

            youtubeVideoModelArrayList.add(youtubeVideoModel);

        }

        return youtubeVideoModelArrayList;
    }

}

위 소스는 fragment가 아닌 activity에 recyclerview 소스를 작성해놓은겁니다.

그래서 fragment에 위 소스인 recyclerview의 activity를 include 해서 실행시키니 recyclerview가 보이지 않습니다..

혹시 activity의 소스가 잘못됐나 해서 manifest에서 MainActivity 대신 위 액티비티를 대신 넣어서 실행해보니

 

이렇게 recyclerview가 잘 보입니다.

해당 recyclerview를 맨 첫번째 사진에 뷰페이저 안 fragment에 넣고싶은데 도져히 감이 안잡힙니다..

fragment에 해당 recyclerview를 어떻게 소스를 바꿔서 옮기면 될까요?

fragment에 activity를 include 하면 그냥 빈화면만 보이고,

fragment에 button을 추가해 intent 해보니 앱이 종료되고요.

도져히 감이 안잡힙니다..

익명사용자 님이 2018년 12월 23일 질문
아그리고 저 나름대로 fragment에 옮겨적어봤지만 앱이 종료되도라고요..

2개의 답변

0 추천

프래그 먼트 생성하시면 자동으로 XML, JAVA 파일 생성되면 JAVA파일에서 자동으로 완성된 다른 메소드들은 아직 필요없으니 다 삭제하시고 onCreateView에서 위 소스 그대로 쓰심 될텐데요. 다만 리사이클러뷰 뷰 연결시켜줄때 
view = inflater.inflate(R.layout.fragment_a, container, false);
recyclerView = (RecyclerView)view.findViewById(R.id.recycler_viewa) ;

return view;
로 바꿔주셔야 해요.

익명사용자 님이 2018년 12월 24일 답변
0 추천
public class Tab1Fragment extends Fragment {
    private RecyclerView mRecyclerView;
    public Tab1RecyclerAdapter mAdapter;

    public Tab1Fragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tab1, container, false);
        mRecyclerView = view.findViewById(R.id.recycler_view_fragment1);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(layoutManager);
        mAdapter = new Tab1RecyclerAdapter(this);
        mRecyclerView.setAdapter(mAdapter);
        return view;
    }
프래그먼트는 액티비티의 하위 개념이라서 프래그먼트에 액티비티를 포함시켜본 적이 없는데,
가능한지 모르겠네요. 보통 메인 액티비티가 하나 있고 거기에 프래그먼트를 추가, 교체해서 사용합니다.
뷰페이져는 프래그먼트의 교체를 좀 더 편리하게 해주는 편의 클래스라고 보시면 됩니다.
프래그먼트마다 별도의 레이아웃을 작성하시고 그 레이아웃을 onCreateView()에서 인플레이트하시면 그 이후에 
그 레이아웃의 하위 뷰(리사이클러뷰)를 참조할 수 있습니다. 그리고 각 리사이클러뷰 마다 어댑터를 만드신 후 
리사이클러뷰에 어댑터를 설정하시면 됩니다.
Fragment1 - RecyclerView1 - RecyclerAdapter1
Fragment2 - RecyclerView2 - RecyclerAdapter2
이런 식으로요.
만약 모든 프래그먼트가 같은 레이아웃을 쓰면, 어댑터만 별도로 작성하시면 됩니다.
franny (1,760 포인트) 님이 2018년 12월 24일 답변
franny님이 2018년 12월 24일 수정
...