Fragment를 이용해서 리스트뷰를 출력하는 실습이 있었다.
평소에 리싸이클러뷰(RecyclerView)를 주로 이용하다가
오랜만에 리스트뷰를 이용하니 기억이 잘 나지 않았다.
라디오버튼과 마찬가지로 이 참에 학습을 해보자.
<fragment_fragment_one.xml>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.kodonho.android.fragmentbasic.FragmentOne">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
위의 리스트뷰를 상세하게 보여줄 item.xml도 있어야 한다.
이 것은 생략하도록 하겠다.
<FragmentOne.java>
public class FragmentOne extends Fragment {
ListView listView;
public FragmentOne() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_one, container, false);
listView = (ListView) view.findViewById(R.id.listView);
CustomAdapter adapter = new CustomAdapter(getActivity());
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 메인액티비티의 함수를 호출해서 상세 fragment 로 position 값을 넘기면서 이동한다
MainActivity activity = (MainActivity) getActivity();
// 클릭했을 때 셀의 포지션...
activity.position = position;
activity.goDetail();
}
});
return view;
}
}
ListView는 View Group이므로 Adapter가 필요하다.
그래서 CustomAdapter라는 것을 만들어, 받은 데이터를 View로 만들도록 한다.
이 때 adapter는 context 자리에 MainActivity를 가지고 온다.
자세한 것은 이후 inflate를 다룰 때 설명하겠다.
CustomAdapter를 구현 후 본문을 볼 수 있도록 onItemClick을 구현한다.
OnItemClick은 setOnItemClickListener를 통해 구현 가능하다.
<FragmentOne.java - CustomAdapter>
class CustomAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
public CustomAdapter(Context context){
this.context = context;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return MainActivity.datas.size();
}
@Override
public Object getItem(int position) {
return MainActivity.datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
convertView = inflater.inflate(R.layout.fragment_item, null);
TextView id = (TextView) convertView.findViewById(R.id.id);
id.setText(position + "");
TextView title = (TextView) convertView.findViewById(R.id.content);
title.setText(MainActivity.datas.get(position).title);
return convertView;
}
}
데이터를 받아 View로 만들어 줄 adapter이다.
기본적으로 context는 받는다. (getActivity())
getView가 중요한데 fragment_item을 inflate하여 convertView에 적용한다.
이 convertView로 data를 개별 아이템 내 반영한다. (setText)
이렇게 각 함수를 채우면 된다.
참고 자료
- 리스트뷰 기본 사용 : http://recipes4dev.tistory.com/42
- 리스트뷰를 이용한 리스트 만들기 : https://goo.gl/sMc7wg
- 안드로이드 커스텀 리스트뷰 만드는 방법 : http://recipes4dev.tistory.com/43
- ArrayAdapter, BaseAdapter를 이용한 ListView 구현 : https://goo.gl/jDCx58
추가 학습 필요 사항
- 인플레이트 inflate : http://aroundck.tistory.com/39
'Android, iOS' 카테고리의 다른 글
[안드로이드] Fragment. 내가 여기서 무릎을 꿇어야 하나. (0) | 2016.10.07 |
---|---|
맥os에서 adb 명령어 실행하기 (0) | 2016.10.07 |
[안드로이드] 라디오 버튼 구현하기 (0) | 2016.10.05 |
[안드로이드] RecyclerView를 포함한 List View / 이미지뷰 찌그러진 이미지 해결 (0) | 2016.09.29 |
[안드로이드] 시크바 / 레이팅바 / Chronometer / 탭위젯 (0) | 2016.09.29 |
Comment