java-androidStudio

안드로이드 스튜디오 ListView 항목 나타내기

uwaTech 2022. 1. 14. 10:46

만만하게 봤다가 헤매는 ListView. DB 연결하기 전에 구조먼저 짜보자

 

필요한 xml 파일 2개 : activity_listview_main화면, layout_listview 화면

필요한 java 파일 3개 : ListviewActivity, VO, Adapter

 

구현하기 전에 전체적인 순서는 다음과 같다.

1. activity_listview_main.xml 에 listView 생성

2. layout_listview.xml에 layout 생성

3. VO.java에 layout에 표현할 변수 선언

4. Adapter.java에 layout 연결하기 + VO에 선언된 변수 가져오기

5. ListviewActivity.java에 adapter 연결하기

 

시작해보자.

1 activity_listview_main.xml 에 listView 생성
<?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">
	<ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
2 layout_listview.xml에 layout 생성
<?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="wrap_content"
    android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/text1"
            android:text="하늘"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/text2"
            android:text="산"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/text3"
            android:text="강"/>

</LinearLayout>
3 VO.java에 layout에 표현할 변수 선언
package user.example.myapplication;

public class VO {
    public String t1;
    public String t2;
    public String t3;

    public void setT1(String txt1){
        t1 = txt1;
    }
    public void setT2(String txt2){
        t2=txt2;
    }
    public void setT3(String txt3){
        t3 = txt3;
    }

    public String getT1(){
        return this.t1;
    }
    public String getT2(){
        return  this.t2;
    }
    public String getT3(){
        return this.t3;
    }

}
4 Adapter.java에 layout 연결하기 + VO에 선언된 변수 가져오기
package user.example.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class Adapter extends BaseAdapter { //BaseAdapter를 반드시 상속해야 한다.
    private ArrayList<VO> VO= new ArrayList<VO>();
    private TextView text1;
    private TextView text2;
    private TextView text3;

    //1. 생성자
    public ReportAdapter(){

    }
    //2.BaseAdapter 상속받으면 자동으로 생기는 메소드들
    //2.1. Adapter에 사용되는 데이터의 개수를 리턴
    @Override
    public int getCount() {
        return reportVO.size();
    }
    //2.2. 지정한 position에 있는 데이터 리턴
    @Override
    public Object getItem(int position) {
        return reportVO.get(position);
    }
    //2.3. 지정한 position에 있는 데이터와 관계된 아이템(row)의 ID를 리턴
    @Override
    public long getItemId(int position) {
        return position;
    }

    // position : 리턴 할 자식 뷰의 위치
    // convertView : 메소드 호출 시 position에 위치하는 자식 뷰 ( if == null 자식뷰 생성 )
    // parent : 리턴할 부모 뷰, 어댑터 뷰
    //2.4. position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴.
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        final Context context = parent.getContext();

        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.layout_listview, parent, false);
        }

        VO vo = VO.get(pos);

        text1 = (TextView)convertView.findViewById(R.id.text1);
        text1.setText(vo.getT1());
        text2 = (TextView)convertView.findViewById(R.id.text2);
        text2.setText(vo.getT2());
        text3 = (TextView)convertView.findViewById(R.id.text3);
        text3.setText(vo.getT3());

        return convertView;
    }

	//3. 다음단계에서 addItem 메소드 정의가 필요함
    public void addItem(String t1,String t2, String t3){
        VO vo = new VO();
        vo.setT1(t1);
        vo.setT2(t2);
        vo.setT3(t3);

        VO.add(vo);
    }

}
5. ListviewActivity.java에 adapter 연결하기
public class ListViewActivity extends AppCompatActivity {
    private ListView listView;
    private ReportAdapter adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview_main);
        
        onSetAdapter();
    }
      
     //listView UI와 연결
    public void onSetAdapter(){
        adapter = new ReportAdapter();
        listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
        adapter.addItem("구름","나무","물고기");
        adapter.notifyDataSetChanged();
    }
    }