목록보기
목록을 세로로 스크롤하여 항목을 보여주는 보기입니다.
세로 스크롤 하위 항목을 표시하는 목록 보기입니다. 안드로이드 개발에서는 데이터를 세로 보기로 표시하는 데 사용됩니다. listview를 사용하는 것은 데이터--, 인터페이스-xml 및 어댑터-어댑터를 사용하는 표준 어댑터 모드입니다. XML은 데이터가 표시되는 방식을 설명하며 이러한 활동은 어댑터에서 제어됩니다. 활동.
맞춤형 어댑터를 사용하는 경우 getView 메소드를 재정의해야 하며 getView 메소드는 사용자 항목에 대한 보기와 데이터를 생성합니다.
사진 보기:
여기에는 뷰를 재사용하여 메모리 소비를 줄이고 항목 로딩 속도를 높이는 최적화가 있습니다.
getView 최적화에 관해서는 누구나 어려움을 겪을 것입니다. 아래에 세 가지 최적화 방법을 정리했습니다.
첫 번째:
convertView를 재사용하면 메모리 소비가 크게 줄어듭니다. ConvertView가 null인지 판단하여 null이면 뷰를 생성한 다음 뷰 데이터를 제공하고 마지막으로 뷰를 하위 레이어로 반환하여 사용자에게 제공해야 합니다.
특징: 현재 ConvertView가 null인 경우 LayoutInFlat을 통해 뷰가 생성됩니다.
ViewCode publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { if(convertView==null) { convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); } TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); ContactInfo1confo=contacts.get(position); if(confo!=null){//toseteveryitem'stext tv_name.setText(confo.getContactName()); tv_phone.setText(confo.getContact_Phone()); } returnconvertView; }
둘째:
위의 작성 방법에는 단점이 있는데, 즉 VIew를 얻을 때마다 다시 findViewById를 거쳐 컨트롤을 다시 찾은 다음 컨트롤의 값을 할당하고 그에 따라 이벤트를 설정하십시오. 이는 geiview에 실제로 이러한 컨트롤이 포함되어 있고 이러한 컨트롤의 ID가 모두 동일하기 때문에 실제로 반복적인 작업을 수행하는 것입니다. 즉, 뷰에서 ViewById를 한 번만 찾으면 되며 ViewById를 찾을 필요가 없습니다. 매번.
두 번째 작성 방법은 다음과 같습니다.
작성 특성은 일반적으로 내부 클래스 classViewHolder입니다. 이 ViewHolder는 다음과 같은 일부 이벤트에 대한 해당 작업 설정을 용이하게 하기 위해 뷰에서 일부 컨트롤을 식별하는 데 사용됩니다. onClick 등. 이렇게 하면 매번 ViewById를 찾을 필요가 없어져 성능 소모가 줄어듭니다. 동시에, ConvertView가 재사용되므로 메모리 소비가 크게 줄어듭니다.
ViewCode publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { ViewHolderholder; if(convertView==null){ convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnconvertView; } classViewHolder { TextViewtv_name,tv_phone; }
셋째:
개인적으로 이런 글쓰기가 가장 편하다고 생각합니다.
기능: 내부 클래스 classViewHolder를 사용하고 ConvertView를 재사용합니다.
두 번째 작성 방법의 차이점은 임시 변수 Viewview=convertView를 사용한 다음 뷰를 수정하고 최종적으로 뷰를 반환한다는 것입니다.
ViewCode @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { Viewview=convertView; ViewHolderholder; if(view==null){ view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); view.setTag(holder); } else { holder=(ViewHolder)view.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnview; } classViewHolder { TextViewtv_name,tv_phone; }
위는 중앙 집중식 작성입니다. 초보자가 배우고 요약할 수 있는 방법입니다.
소스 코드는 다음과 같습니다. LisViewTest.zip
아래층 친구들의 제안에 따르면 아직 최적화할 부분이 있다는 것을 확인했습니다. 최신 업데이트는 다음과 같습니다.
ViewCode @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { Viewview=convertView; ViewHolderholder; if(view==null){ view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); view.setTag(holder); } else { holder=(ViewHolder)view.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnview; } <fontcolor="\"#0000ff\""></font>staticclassViewHolder { TextViewtv_name,tv_phone; }
참고: staticclassViewHolder
여기에 ViewHolder를 설정합니다. 정적 클래스는 처음 로드할 때만 시간이 오래 걸리지만 나중에 로드하는 데 도움이 될 수 있습니다. 메모리에 하나의 ViewHolder만 있으므로 메모리 오버헤드가 절약됩니다.