カスタムアダプタ
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);
}
}
Reference
この問題について(カスタムアダプタ), 我々は、より多くの情報をここで見つけました https://velog.io/@bluesun147/커스텀-어댑터テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol