가장 많이 사용 되 고 가장 사용 하기 어 려 운 Android 컨트롤 ListView
1.ListView 의 간단 한 사용법
먼저 ListView Test 항목 을 새로 만 든 다음 activity 를 수정 합 니 다.main.xml 코드.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
ListView 에 id 를 지정 하고 너비 와 높이 를 match 로 변경 합 니 다.parent,이렇게 ListView 는 전체 레이아웃 의 공간 을 차지 합 니 다.ListView 레이아웃
다음은 MainActivity 의 코드 를 수정 합 니 다.
public class MainActivity extends Activity {
private String[] data = {"Apple","Banana","Orange","Watermelon",
"Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// , .
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(MainActivity.this, android.R.layout.simple_list_item_1,data);
ListView listView = (ListView) findViewById(R.id.list_view);
// ListView .
listView.setAdapter(adapter);
}
}
배열 의 데 이 터 는 ListView 에 직접 전달 할 수 없습니다.어댑터 를 통 해 이 루어 져 야 합 니 다.그 중에서 가장 좋 은 것 은 Array Adapter 입 니 다.추가 할 데이터 형식 을 범 형 으로 지정 한 다음 구조 함수 에서 적합 한 데 이 터 를 전송 하면 됩 니 다.android.R.layot.simple 을 사용 하 였 음 을 주의 하 십시오.list_item_1.ListView 의 하위 항목 레이아웃 id 와 적합 한 데이터 입 니 다.마지막 으로,우 리 는 ListView 의 SetAdapter()방법 을 호출 하여 구 조 된 어댑터 대상 을 전달 해 야 합 니 다.그러면 ListView 와 데이터 간 의 연결 이 완 료 됩 니 다.
ListView 와 데이터 연결
2.맞 춤 형 ListView 인터페이스
이 어 하나의 실체 클래스 를 정의 합 니 다.ListView 어댑터 의 어댑터 형식 으로 새 클래스 Fruit 는 그림 을 준비 해 야 합 니 다.
public class Fruit {
private String name;
private int imageId;
public Fruit(String name, int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public int getImageId() {
return imageId;
}
}
Fruit 류 에는 두 개의 필드 만 있 습 니 다.name 은 과일의 이름 을 표시 하고 imageId 는 과일 이 그림 에 대응 하 는 자원 id 를 표시 합 니 다.그리고 ListView 의 하위 항목 에 사용자 정의 레이아웃 을 지정 해 야 합 니 다.layot 디 렉 터 리 에 새 fruititem.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" >
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip" />
</LinearLayout>
이 레이아웃 에서 과일 을 표시 할 이미지 뷰 를 정의 하고 과일 이름 을 표시 할 텍스트 뷰 를 정의 합 니 다.다음 에 사용자 정의 어댑터 를 만들어 야 합 니 다.이 어댑터 는 Array Adapter 에서 계승 되 고 범 형 을 Fruit 클래스 로 지정 합 니 다.새 클래스 FruitAdapter 는 코드 가 다음 과 같 습 니 다.
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
FruitAdapter 는 부모 클래스 의 구조 함 수 를 재 작성 하여 컨 텍스트,ListView 하위 항목 레이아웃 의 id 와 데 이 터 를 전달 합 니 다.또한 getView()방법 을 재 작성 하 였 습 니 다.먼저 getItem()방법 을 통 해 현재 항목 의 Fruit 인 스 턴 스 를 얻 은 다음 Layout Inflater 를 사용 하여 이 하위 항목 에 우리 가 들 어 온 레이아웃 을 불 러 옵 니 다.이 어 View 의 fndView ById()방법 을 호출 하여 ImageView 와 TextView 의 인 스 턴 스 를 각각 가 져 오고 setImageResource 와 setText 방법 으로 표 시 된 그림 과 문 자 를 설정 하 며 레이아웃 을 되 돌려 주 는 것 이 좋 습 니 다.다음은 MainActivity 의 코드 를 수정 합 니 다.다음 과 같 습 니 다.
public class MainActivity extends Activity {
private List<Fruit> fruitList = new ArrayList<Fruit>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();
FruitAdapter adapter = new FruitAdapter(MainActivity.this,
R.layout.fruit_item, fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
private void initFruits() {
Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
fruitList.add(apple);
Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
fruitList.add(banana);
Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
fruitList.add(orange);
Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
fruitList.add(watermelon);
Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
fruitList.add(pear);
Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
fruitList.add(grape);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
fruitList.add(strawberry);
Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
fruitList.add(cherry);
Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
fruitList.add(mango);
}
}
모든 과일의 데 이 터 를 초기 화 하 는 데 사용 되 는 initFruits()방법 이 추가 되 었 습 니 다.Fruit 류 구조 함수 에서 과일의 이름과 해당 하 는 그림 id 를 전송 한 다음 에 만 든 대상 을 과일 목록 에 추가 한 다음 에 onCreate()방법 에서 FruitAdapter 대상 을 만 들 고 FruitAdapter 를 어댑터 로 ListView 에 전달 합 니 다.3.ListView 의 운영 효율 향상
FruitAdapter 의 getView()방법 에서 매번 레이아웃 을 다시 불 러 오기 때문에 ListView 가 빠르게 굴 러 갈 때 성능 에 장애 가 됩 니 다.
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position); // Fruit
View view;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
} else {
view = convertView;
}
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
그래서 저 희 는 getView()방법 에서 판단 을 했 습 니 다.convertView 가 비어 있 으 면 LayoutInflater 를 사용 하여 레이아웃 을 불 러 오고 비어 있 지 않 으 면 convertView 를 다시 사용 합 니 다.매번 getView()방법 에서 View 의 findViewById()방법 을 호출 하여 컨트롤 의 인 스 턴 스 를 얻 을 수 있 습 니 다.우 리 는 ViewHolder 를 통 해 이 부분의 성능 을 최적화 시 키 고 FruitAdapter 의 코드 를 수정 할 수 있 습 니 다.다음 과 같 습 니 다.
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
}
컨트롤 의 인 스 턴 스 를 캐 시 할 내부 클래스 ViewHolder 를 새로 만 들 었 습 니 다.convertView 가 비어 있 을 때 ViewHolder 대상 을 만 들 고 컨트롤 의 인 스 턴 스 를 ViewHolder 에 저장 한 다음 View 의 SetTag()방법 을 호출 하여 ViewHolder 대상 을 View 에 저장 합 니 다.convertView 가 비어 있 지 않 을 때 View 의 getTag()방법 을 호출 합 니 다.ViewHolder 를 다시 꺼 냅 니 다.모든 컨트롤 의 인 스 턴 스 를 ViewHolder 에 캐 시 하면 매번 findViewById()방법 으로 컨트롤 인 스 턴 스 를 가 져 올 필요 가 없습니다.4.ListView 의 클릭 이벤트
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(MainActivity.this, fruit.getName(),
Toast.LENGTH_SHORT).show();
}
});
최종 효과 도:5.총화
먼저 레이아웃 에 ListView 컨트롤 을 추가 합 니 다.
그리고 어댑터 를 사용자 정의 합 니 다.이 어댑터 는 Array Adapter 에서 계승 합 니 다.
데이터 초기 화,사용자 정의 어댑터 에 데이터 전송
그리고 어댑터 를 ListView 에 전달 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.