리스트 뷰를 전체적으로 이해한 것이 아닌 코틀린 방과후 프로젝트와 안드 천재 분들이 정리해두신 블로그 글을 참고하여 구현하였다.
나는 이후에 같은 내용을 또 찾지 않도록 블로그에 나만의 방식으로 정리하기로 하였다.
내 글을 통해 개념을 파악할 수는 없지만 흐름대로 따라하여 완성할 수 있는 것에 초점을 맞추었다.
xml
call_list.xml
List View 정의
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:orientation="vertical"
tools:context=".CallFragment">
<ListView
android:id="@+id/lawfirmListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
call_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:orientation="horizontal">
<TextView
android:id="@+id/reportText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="사이버 경찰청"
android:textSize="16sp"
android:textColor="#000" />
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/reportNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="112"
android:textSize="16sp"
android:textColor="#AAAAAA"/>
<ImageButton
android:id="@+id/reportCall"
android:layout_width="50dp"
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/call_img"/>
</LinearLayout>
</LinearLayout>
java
CallListViewItem
값을 넘겨주기 위한 클래스라고 이해했다.!
우선 내 리스트 목록에는 전화번호 소속 이름, 전화번호, 전화걸도록 넘겨주는 버튼으로 구성되어있다.
전화걸도록 넘겨주는 버튼은 전화번호 값을 이용하는 것이므로 내가 넘겨줘야하는 값는 전화번호 이름과 전화번호 두 개이다. 넘길 정보만큼 set/get을 만들면 된다.
public class CallListViewItem {
private String text;
private String num;
public void setText(String _text){
text = _text;
}
public void setNum(String _num) {
num = _num;
}
public String getText(){
return this.text;
}
public String getNum(){
return this.num;
}
}
CallListViewAdapter
1. item.xml에 있는 id 선언 및 ArrayList 선언
CallListViewItem - 자바 클래스 이름
reportLilstViewItemList - 선언한 ArrayList 이름
public class CallListViewAdapter extends BaseAdapter {
private TextView reportText;
private TextView reportNum;
private ImageButton reportCall;
private ArrayList<CallListViewItem> reportListViewItemList = new ArrayList<CallListViewItem>();
public CallListViewAdapter() { }
...
2. getCount()
ArrayList 사이즈 리턴
//Adapter에 사용되는 데이터 수 리턴
@Override
public int getCount() {
return reportListViewItemList.size();
}
3. getView()
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final Context context = viewGroup.getContext();
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.fragment_call_item, viewGroup, false);
}
//선언했던 변수들에게 id 저장
reportText = (TextView) view.findViewById(R.id.reportText);
reportNum = (TextView) view.findViewById(R.id.reportNum);
reportCall = (ImageButton) view.findViewById(R.id.reportCall);
final CallListViewItem listViewItem = reportListViewItemList.get(i);
//정보 넘기기
reportText.setText(listViewItem.getText());
reportNum.setText(listViewItem.getNum());
//reportCall은 전화거는 화면으로 이동
reportCall.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent();
String telNum = "tel:" + listViewItem.getNum();
//Log.d("myapp", telNum);
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse(telNum));
context.startActivity(intent);
}
});
return view;
}
4. getItem(), getItemId()
@Override
public Object getItem(int i) {
return reportListViewItemList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
5. addItem()
item.java에서 데이터 받아오기
public void addItem(String text, String num){
CallListViewItem item = new CallListViewItem();
item.setText(text);
item.setNum(num);
reportListViewItemList.add(item);
}
}
전체코드
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import java.util.ArrayList;
public class CallListViewAdapter extends BaseAdapter {
private TextView reportText;
private TextView reportNum;
private ImageButton reportCall;
private TextView lawfirmText;
private TextView lawfirmNum;
private ImageButton lawfirmCall;
private ArrayList<CallListViewItem> reportListViewItemList = new ArrayList<CallListViewItem>();
//private ArrayList<CallListViewItem> lawfirmListViewItemList = new ArrayList<CallListViewItem>();
public CallListViewAdapter() { }
//Adapter에 사용되는 데이터 수 리턴
@Override
public int getCount() {
return reportListViewItemList.size();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final Context context = viewGroup.getContext();
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.fragment_call_item, viewGroup, false);
}
reportText = (TextView) view.findViewById(R.id.reportText);
reportNum = (TextView) view.findViewById(R.id.reportNum);
reportCall = (ImageButton) view.findViewById(R.id.reportCall);
final CallListViewItem listViewItem = reportListViewItemList.get(i);
reportText.setText(listViewItem.getText());
reportNum.setText(listViewItem.getNum());
reportCall.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent();
String telNum = "tel:" + listViewItem.getNum();
//Log.d("myapp", telNum);
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse(telNum));
context.startActivity(intent);
}
});
return view;
}
@Override
public Object getItem(int i) {
return reportListViewItemList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
public void addItem(String text, String num){
CallListViewItem item = new CallListViewItem();
item.setText(text);
item.setNum(num);
reportListViewItemList.add(item);
}
}
MainActivity(Call.java)
fragment를 상속받을 경우 기본 셋팅 코드에서 return 값을 View 변수로 선언하여 사용해야한다.
findViewById같은 경우에도 그냥 사용할 수 없으므로 View에 있는 findViewById를 사용해줘야한다.
.addItem을 통해 값을 넘겨주는데, Item.java 클래스에서 만든 getter/setter에 값이 넘어간다.
public class CallFragment extends Fragment {
private ListView listView;
private CallListViewAdapter adpater;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_call_list, container, false);
//adpater 선언
adpater = new CallListViewAdapter();
listView = (ListView) v.findViewById(R.id.reportListView);
listView.setAdapter(adpater);
adpater.addItem("경찰청", "01010101010");
//값 변경 알림
adpater.notifyDataSetChanged();
return v;
}
}
블로그 따라하면서 어쩌다보니 성공해서 조금 놀라운데... 프로젝트를 빨리 끝내야해서 개념도 이해하기에는 벅차므로...
기회가 된다면 나중에 list view 개념을 익혀봐야겠다.
참고자료
- list view
개념 참고 : https://itmining.tistory.com/1
코드 참고 : https://baessi.tistory.com/52
- ACTION_DIAL
https://aries574.tistory.com/130
'Study > Android' 카테고리의 다른 글
[Android | JAVA] 안드로이드 타이틀바, 상태바 색깔 바꾸기 (0) | 2021.08.30 |
---|---|
[Android | JAVA] ListView 2개 / scrollView 사용하기 (0) | 2021.08.30 |
[Android] Bottom Navigation Bar 모음 (0) | 2021.08.28 |
댓글