Programming/Android

[안드로이드] Fragment에서 RecyclerView 사용하기

devssun 2017. 3. 8. 01:30
728x90
반응형



앞 포스트에서는 RecyclerView에 대해 간략히 알아보았고 이번엔 실제로 Fragment에 RecyclerView를 넣는 소스


RecyclerView를 사용하기 위해서는 dependencies에 추가하는 것이 필요하다



- gradle에 추가하기 (버전은 다를 수 있음)

compile 'com.android.support:recyclerview-v7:24.0.0'






근데 자꾸 코드도 중간정렬이 된다 8ㅅ8


- fragment_voca_main.xml


이 레이아웃은 MainFragment.java에서 인플레이션 할 것이다. RecyclerView를 하나 가져온다

overScrollMode="never" 는 스크롤이 끝났을 때 나타나는 파란색 그라데이션 효과를 없앨 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.dev.choihyesun.studyapp.MainActivity">
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="@android:color/background_light">
 
    </android.support.v7.widget.RecyclerView>
 
</RelativeLayout>
 
cs




- WordItemData.java

이건 딱히 안써도 되는 클래스.. 그냥 본 예제에서 따로 써놨길래 나도 따로 구현했다

입력받은 숫자대로 리스트를 생성하는 함수가 정의됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class WordItemData {
    public String word;
    public String meaning;
 
    // 화면에 표시될 문자열 초기화
    public WordItemData(String word, String meaning) {
        this.word = word;
        this.meaning = meaning;
    }
 
    // 입력받은 숫자의 리스트생성
    public static ArrayList<WordItemData> createContactsList(int numContacts) {
        ArrayList<WordItemData> contacts = new ArrayList<WordItemData>();
 
        for (int i = 1; i <= numContacts; i++) {
            contacts.add(new WordItemData("Person ""wohahahaha"));
        }
 
        return contacts;
    }
}
 
cs





- MainFragment.java


앞서 정의한 xml을 인플레이션하고 그 ViewGroup의 객체로 recyclerView를 가져온다**


adapter = new MainViewAdapter(getActivity(), list);

이 부분을 액티비티에 작성할 경우 getActivity() 를 this로 작성할 수 있는데 이 클래스는 Fragment를 상속받으므로

해당 Fragment를 관리하는 Activity를 리턴하는 함수(getActivity())를 매개변수로 넘긴다


이후 LayoutManager, Adapter와도 연결!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MainFragment extends android.support.v4.app.Fragment {
 
    private RecyclerView recyclerView;
    private MainViewAdapter adapter;
    private ArrayList<WordItemData> list = new ArrayList<>();
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_voca_main, container, false);
 
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
 
        list = WordItemData.createContactsList(5);
        recyclerView.setHasFixedSize(true);
        adapter = new MainViewAdapter(getActivity(), list);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);
 
        Log.e("Frag""MainFragment");
        return rootView;
    }
}
cs




- MainViewAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class MainViewAdapter extends RecyclerView.Adapter<MainViewAdapter.Holder> {
 
    private Context context;
    private List<WordItemData> list = new ArrayList<>();
 
    public MainViewAdapter(Context context, List<WordItemData> list) {
        this.context = context;
        this.list = list;
    }
 
    // ViewHolder 생성
    // row layout을 화면에 뿌려주고 holder에 연결
    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_voca_row, parent, false);
        Holder holder = new Holder(view);
        return holder;
    }
 
    /*
    * Todo 만들어진 ViewHolder에 data 삽입 ListView의 getView와 동일
    *
    * */
    @Override
    public void onBindViewHolder(Holder holder, int position) {
        // 각 위치에 문자열 세팅
        int itemposition = position;
        holder.wordText.setText(list.get(itemposition).word);
        holder.meaningText.setText(list.get(itemposition).meaning);
        Log.e("StudyApp""onBindViewHolder" + itemposition);
    }
 
    // 몇개의 데이터를 리스트로 뿌려줘야하는지 반드시 정의해줘야한다
    @Override
    public int getItemCount() {
        return list.size(); // RecyclerView의 size return
    }
 
    // ViewHolder는 하나의 View를 보존하는 역할을 한다
    public class Holder extends RecyclerView.ViewHolder{
        public TextView wordText;
        public TextView meaningText;
 
        public Holder(View view){
            super(view);
            wordText = (TextView) view.findViewById(R.id.wordText);
            meaningText = (TextView) view.findViewById(R.id.meaningText);
        }
    }
}
cs





이 화면의 경우 내가 커스텀한 뷰를 사용했기 때문에 일반적으로 생각하는 리스트와 다른 형태이다!-!

오잉 다섯개짜린데 gif로 변환하니까 2개밖에 안뜬다  암튼 이렇게.. 완성할 수 있다.



      


반응형