カスタムアダプタ

32227 ワード

カスタムアダプタはBaseAdapter継承によって作成されます.
// MyFirstAdapter.java
public class MyFirstAdapter extends BaseAdapter
{ // ctrl+i 메소드 implement

    private final List<Weather> mData; // Weather 타입의 리스트 저장
    private Map<String, Integer> mWeatherImageMap;

    public MyFirstAdapter(List<Weather> data)
    { // List로 구현한 모든것(ArrayList 등..) 받는 생성자
        mData = data;
        mWeatherImageMap = new HashMap<>();
        mWeatherImageMap.put("맑음", R.drawable.sunny);
        mWeatherImageMap.put("구름", R.drawable.cloudy);
        mWeatherImageMap.put("비", R.drawable.rain);
        mWeatherImageMap.put("눈", R.drawable.snow);

    }

    @Override
    public int getCount() { // 아이템 개수
        return mData.size();
    }

    @Override
    public Object getItem(int position) { // position 번째 아이템
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) { // position 번째 아이디
        return position;
    }

    static class ViewHolder // 자주 사용하는 뷰 한번 로드 후 재사용하고
    { // 표시할 내용만 교체 위한 패턴. 각 아이템에 표시될 에퍼런스 저장해 재사용
        ImageView weatherImage;
        TextView cityText;
        TextView tempText;
    }
    
    @Override
    // position 번째 아이템의 View를 구성하는 부분
    // 레이아웃에 적절한 데이터 표시 위해 필요
    // getView가 어댑터에서 가장 핵심
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
        
        if (convertView == null) { // convertView는 재사용 되므로 한번만 호출하도록. - 최적화
            holder = new ViewHolder();
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_weather, parent, false);

            // 날씨, 도시, 기온 뷰
            ImageView weatherImage = convertView.findViewById(R.id.weather_image);
            TextView cityText = convertView.findViewById(R.id.city_text);
            TextView tempText = convertView.findViewById(R.id.temp_text);

            holder.weatherImage = weatherImage;
            holder.cityText = cityText;
            holder.tempText = tempText;
            convertView.setTag(holder); // ViewHolder객체는 setTag 메서드에 연결해 재사용시 꺼내서 사용
            // setTag는 모든 객체 담을 수 있는 다용도 메소드
        }
        else
            holder = (ViewHolder) convertView.getTag();


        // 현재 포지션의 날씨 데이터
        Weather weather = mData.get(position);

        // 데이터 설정
        holder.cityText.setText(weather.getCity());
        holder.tempText.setText(weather.getTemp());
        holder.weatherImage.setImageResource(mWeatherImageMap.get(weather.getWeather()));
        return convertView;
    }
}
// Weather.java
// 모델 클래스 (데이터 클래스)
public class Weather
{
    private String city;
    private String temp;
    private String weather;

    // constructor
    public Weather(String city, String temp, String weather) {
        this.city = city;
        this.temp = temp;
        this.weather = weather;
    }
    // getter and setter generate
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getWeather() {
        return weather;
    }

    public void setWeather(String weather) {
        this.weather = weather;
    }

    @Override
    public String toString()
    {
        return "Weather{" +
                "city='" + city + '\'' +
                ", temp='" + temp + '\'' +
                ", weather='" + weather + '\'' +
                '}';
    }
}
// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 자료
        ArrayList<Weather> data = new ArrayList<>();
        data.add(new Weather("수원", "25도", "맑음"));
        data.add(new Weather("서울", "26도", "비"));
        data.add(new Weather("안양", "24도", "구름"));
        data.add(new Weather("부산", "29도", "구름"));
        data.add(new Weather("인천", "23도", "맑음"));
        data.add(new Weather("대구", "28도", "비"));
        data.add(new Weather("용인", "25도", "비"));

        data.add(new Weather("수원", "25도", "맑음"));
        data.add(new Weather("서울", "26도", "비"));
        data.add(new Weather("안양", "24도", "구름"));
        data.add(new Weather("부산", "29도", "구름"));
        data.add(new Weather("인천", "23도", "맑음"));
        data.add(new Weather("대구", "28도", "비"));
        data.add(new Weather("용인", "25도", "비"));
        // 어댑터
        MyFirstAdapter adapter = new MyFirstAdapter(data);
        /* 파라미터: context(MainActivity가 Context를 상속했기 때문에 this로 제공,
         int(레이아웃 리소스 id. 문자열 데이터를 보여줄 뷰),
          List(ArrayList등) */
        // simple_list_item_1는 안드로이드가 기본으로 제공하는 TextView하나만 가지는 레이아웃 가리키는 id
        // 이 어댑터는 하나의 텍스트 가진 레이아웃의 data에 담긴 String 데이터를 표시.

        // 뷰와 어댑터 연걸
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}