본문 바로가기
Study/Android

[Android | JAVA] List View

by M개발자 2021. 8. 29.
반응형

리스트 뷰를 전체적으로 이해한 것이 아닌 코틀린 방과후 프로젝트와 안드 천재 분들이 정리해두신 블로그 글을 참고하여 구현하였다.

나는 이후에 같은 내용을 또 찾지 않도록 블로그에 나만의 방식으로 정리하기로 하였다.

내 글을 통해 개념을 파악할 수는 없지만 흐름대로 따라하여 완성할 수 있는 것에 초점을 맞추었다.

완성본!!

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

프로젝트 진행하면서  정리해 메인 액티비티가 fragment입니다..!

 

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

 

반응형

댓글