앞 포스트에서는 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 |
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개밖에 안뜬다 암튼 이렇게.. 완성할 수 있다.
'Programming > Android' 카테고리의 다른 글
[안드로이드] OpenCV샘플소스 - CameraControl (0) | 2017.03.09 |
---|---|
[안드로이드] Navigation Drawer 사용하기 (0) | 2017.03.08 |
[안드로이드] RecyclerView에 대해 간단히 알아보기 (0) | 2017.03.07 |
[안드로이드] 프래그먼트 구현하기 (Implementation Fragment) (0) | 2017.03.06 |
[안드로이드] excution failed for task app clean 해결법 (0) | 2016.09.23 |