가장 많이 사용 되 고 가장 사용 하기 어 려 운 Android 컨트롤 ListView

10951 단어 AndroidListView
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 에 전달 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기