개발모음집

[안드로이드 프로그래밍] Day16 리스트뷰 사용하기 본문

Android

[안드로이드 프로그래밍] Day16 리스트뷰 사용하기

void 2016. 6. 9. 16:53

* 데이터 조작은 리스트뷰에서는 안되고, 어댑터에서 관리한다.





MyList의 MainActivity.java



package com.example.tristan91.mylist;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
ListView listView;
SingerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
adapter = new SingerAdapter(); // 어댑터 객체 생성
listView.setAdapter(adapter); // 리스트에 어댑터를 추가
}

class SingerAdapter extends BaseAdapter {
String[] names = {"소녀시대", "AOA", "IOI", "걸스데이"};


@Override
public int getCount() { // 리스트뷰가 어댑터한테 리스트 몇 개가지고 있냐고 물어보면 실행하는 메소드
return names.length;
}

@Override
public Object getItem(int position) { // position == index
return names[position]; // 실제값을 넘겨줌
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

TextView view = new TextView(getApplicationContext());
view.setText(names[position]);
view.setTextColor(Color.BLACK);
view.setTextSize(50.0f);
return view;
}
}

}

MyList의 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
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.example.tristan91.mylist.MainActivity">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_centerHorizontal="true" />

<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_below="@+id/button"
android:layout_centerHorizontal="true" />
</RelativeLayout>

결과물




그런데 보통 리스트는 한글로만 안하고 그림과 함께 나온다.

--> '뷰그룹'사용


MyList의 MainActivity.java

package com.example.tristan91.mylist;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {
ListView listView;
SingerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
adapter = new SingerAdapter();
listView.setAdapter(adapter); // 리스트에 어댑터를 추가
}

class SingerAdapter extends BaseAdapter {
String[] names = {"소녀시대", "AOA", "IOI", "걸스데이"};
String[] ages = {"28", "22", "20", "25"};


@Override
public int getCount() { // 리스트뷰가 어댑터한테 리스트 몇 개가지고 있냐고 물어보면 실행하는 메소드
return names.length;
}

@Override
public Object getItem(int position) { // position == index
return names[position]; // 실제값을 넘겨줌
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
TextView view = new TextView(getApplicationContext());
view.setText(names[position]);
view.setTextColor(Color.BLACK);
view.setTextSize(50.0f);
return view;
*/
SingerItemView view = new SingerItemView(getApplicationContext());
view.setName(names[position]);
view.setAge(ages[position]);
return view;
}
}

}

리스트뷰의 리스트에 들어갈 레이아웃을 만들어주자

 MyList의 singer_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@android:drawable/sym_def_app_icon"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical">

<TextView
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:textColor="#ff000000"
/>
<TextView
android:id="@+id/ageTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:textColor="#ff0000ff"
/>


</LinearLayout>
</LinearLayout>




이 xml과 짝을 이뤄줄 java소스파일 생성

MyList의 SingerItemView.java


package com.example.tristan91.mylist;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
* Created by Tristan91 on 2016-06-09.
*/
public class SingerItemView extends LinearLayout{

//singer_item.xml의 짝으로 만들어진 소스코드 그렇기 때문에 xml 레이아웃의 최상위 레이아웃인 LinearLayout의 클래스를 상속받아야한다.

TextView nameTextView;
TextView ageTextView;

public SingerItemView(Context context) {
super(context);
init(context);
}

public SingerItemView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //인플래이션
inflater.inflate(R.layout.singer_item, this, true);
nameTextView = (TextView) findViewById(R.id.nameTextView);
ageTextView = (TextView) findViewById(R.id.ageTextView);
}

public void setName(String name) {
nameTextView.setText(name);
}
public void setAge(String age) {
ageTextView.setText(age);
}


}

그런데 데이터를 소스안에 넣어두는 경우가 없다.

보통은 db에서 끌어오겠지?







MyList의 MainActivity.java


package com.example.tristan91.mylist;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
ListView listView;
SingerAdapter adapter;

// 사용자가 입력한 데이터로 보자
String[] names = {"소녀시대", "AOA", "IOI", "걸스데이"};
String[] ages = {"28", "22", "20", "25"};




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
adapter = new SingerAdapter();

adapter.addItem(new SingerItem(names[0], ages[0])); // 데이터 추가
adapter.addItem(new SingerItem(names[1], ages[1]));
adapter.addItem(new SingerItem(names[2], ages[2]));
adapter.addItem(new SingerItem(names[3], ages[3]));

listView.setAdapter(adapter); // 리스트에 어댑터를 추가
}

class SingerAdapter extends BaseAdapter {
ArrayList<SingerItem> items = new ArrayList<SingerItem>(); // 아이템 보관하기 위한 소스


@Override
public int getCount() { // 리스트뷰가 어댑터한테 리스트 몇 개가지고 있냐고 물어보면 실행하는 메소드
return items.size();
}

public void addItem(SingerItem item) { // 데이터를 추가해주는 메서드
items.add(item);
}

@Override
public Object getItem(int position) { // position == index
return items.get(position); // 실제값을 넘겨줌
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) { //View convertView 리스트가 많아지면 메모리가 많이 먹음, 그래서 재사용을 함으로써 재사용을 위한 인자
/*
TextView view = new TextView(getApplicationContext());
view.setText(names[position]);
view.setTextColor(Color.BLACK);
view.setTextSize(50.0f);
return view;
*/
SingerItemView view = null;
if (convertView == null) { // 뷰가 없으면 생성
view = new SingerItemView(getApplicationContext());
} else {// 재사용
view = (SingerItemView) convertView;
}

SingerItem curItem = items.get(position);// 현재 아이템
view.setName(curItem.getName());
view.setAge(curItem.getAge());
return view;
}
}

}

MyList의 SingerItem.java

package com.example.tristan91.mylist;

/**
* Created by Tristan91 on 2016-06-09.
*/
public class SingerItem {
//데이터 저장클래스
String name, age;

public SingerItem() {

}

public SingerItem(String name, String age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
}



MyList의 activity_main.xml