Android -- Adapter 깊이 이해 및 ListView 최적화

윗글 을 잇다
          이전 글 은 주로 안 드 로 이 드 에서 Adapter 의 역할 과 디자인 모델 에서 어댑터 모델 과 의 공통점 을 토론 하고 제시 했다.
   Android 에서 Adapter 의 시스템 구조 입 니 다.지난 글 에서 Adapter 는 데이터 소스 와 AdapterView 사이 라 는 것 을 알 게 되 었 지만
   교량, AdapterView 와 데이터 소스 '인터페이스' 의 '적합' 을 완성 합 니 다.하지만 Adapter 가 어떻게 일 하 는 지 는 잘 모 르 겠 습 니 다.
   따라서 이 글 은 Adapter 의 작업 과정 을 깊이 이해 하고 소 편 도 로봇 초보 다.소감 을 적어 서 다 같이.
   공부
          Android 의 어댑터 는 다양 합 니 다. AdapterView 도 많 습 니 다. 여기 서 는 ListView 와 BaseAdapter 를 사용 하여 이해 합 니 다.
   그 작업 원리.이 를 사용 하 는 것 은 다음 과 같은 몇 가지 고려 를 바탕 으로 하 는 것 이다. 1. ListView 는 개발 에서 많이 사용 되 고 응용 장면 이 매우 광범 위 하 다.
   2. 자료 의 조 회 를 통 해 BaseAdapter 가 더욱 변화 하 는 구 조 를 실현 할 수 있 고 ListView 의 최적화 문제 와 관련된다.됐다.
   잡담 은 그만 하고 구체 적 인 예 를 보 자!
         activity_main.xml
                      
           list_item.xml
                                              
           MainActivity.java
package com.example.listview_baseadapter;  import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;  import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView;  public class MainActivity extends Activity {  	private ListView listView = null; 	private List> data = null;  	@Override 	protected void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		setContentView(R.layout.activity_main); 		listView = (ListView) findViewById(R.id.list);//              data = getData();//             MyAdapter adapter = new MyAdapter(this);         listView.setAdapter(adapter); 	}  	@Override 	public boolean onCreateOptionsMenu(Menu menu) { 		// Inflate the menu; this adds items to the action bar if it is present. 		getMenuInflater().inflate(R.menu.main, menu); 		return true; 	}  	//      	public List> getData() { 		List> list = new ArrayList>();  		 Map map; 	        for(int i=0;i<10;i++) 	        { 	            map = new HashMap(); 	            map.put("img", R.drawable.bgs); 	            map.put("title", "Coder");             map.put("content", "  Coding,    ~~~~"); 	            list.add(map); 	        } 	        return list; 	}  	// ViewHolder    	static class ViewHolder { 		public ImageView img; 		public TextView title; 		public TextView content; 	}  	public class MyAdapter extends BaseAdapter {  		private LayoutInflater mInflater = null;  		private MyAdapter(Context context) { 			//   context        			this.mInflater = LayoutInflater.from(context); 		}  		@Override 		public int getCount() { 			//                    			return data.size(); 		}  		@Override 		public Object getItem(int position) { 			 			//                   			return position; 		}  		@Override 		public long getItemId(int position) { 		 			//                id 			return position; 		}  		//                       		@Override 		public View getView(int position, View convertView, ViewGroup parent) { 			ViewHolder holder = null; 			//     convertView  ,     View 			if (convertView == null) { 				holder = new ViewHolder(); 				//       Item       				convertView = mInflater.inflate(R.layout.list_item, null); 				holder.img = (ImageView) convertView.findViewById(R.id.img); 				holder.title = (TextView) convertView.findViewById(R.id.title); 				holder.content = (TextView) convertView.findViewById(R.id.content); 				//              ,      Tag ,        Tag 				convertView.setTag(holder); 			} else { 				holder = (ViewHolder) convertView.getTag(); 			} 			holder.img.setBackgroundResource((Integer) data.get(position).get( 					"img")); 			holder.title.setText((String) data.get(position).get("title")); 			holder.content.setText((String) data.get(position).get("content"));  			return convertView; 		}  	}  } 
                 직접 효과 그림 올 리 기:
               언급 해 야 할 것 은 상기 코드 의 실현 은 ListView 의 최 적 화 를 고려 하여 ListView 에 대한 최적화 문 제 를 떠 나 는 것 이다.MyAdapter 클래스 중
       의 getView () 가 가장 중요 하 다. 여기 도 ListView 효율 에 영향 을 주 는 관건 이다.
             getView () 방법 에 대한 처 리 는 보통 세 가지 방식 이 있 습 니 다.
                      1. 아무런 처리 없 이 이런 방식 은 데이터 양 이 적은 상황 에서 만 사용 할 수 있 기 때문에 이 방식 을 사용 하 는 것 을 권장 하지 않 습 니 다.
public View getView(int position, View convertView, ViewGroup parent) { 			View item = mInflater.inflate(R.layout.list_item, null);             ImageView img = (ImageView)item.findViewById(R.id.img);              TextView title = (TextView)item.findViewById(R.id.title);             TextView content = (TextView)item.findViewById(R.id.content);             img.setImageResource(R.drawable.bgs);             title.setText("Coding");             content.setText("    ,    ~~~");             return item; }
                  
  2. 캐 시 converView 최 적 화 를 통 해 캐 시 에 View 가 존재 하지 않 는 다 고 판 단 될 수 있 습 니 다. 있 으 면 캐 시 에 있 는 View 를 이용 합 니 다.
           성능 을 향상 시 켰 다.
public View getView(int position, View convertView, ViewGroup parent) { 			if(convertView == null)             {                 convertView = mInflater.inflate(R.layout.list_item, null);             }             ImageView img = (ImageView)convertView.findViewById(R.id.img);              TextView title = (TextView)convertView.findViewById(R.id.title);             TextView content = (TextView)convertView.findViewById(R.id.content);             img.setImageResource(R.drawable.bgs);             title.setText("Coding");             content.setText("    ,    ~~~");             return convertView; }
                     3. 세 번 째 방식 은 상기 코드 가 실 현 된 부분 입 니 다. convertView + ViewHolder 를 통 해 이 루어 지고 ViewHolder 를 사용 합 니 다.
             이 정적 클래스 의 장점 은 데 이 터 를 표시 하 는 View 를 캐 시 하여 UI 의 응답 속 도 를 가속 화 하 는 것 이다.
                     convertView = = null 을 판단 할 때 비어 있 으 면 설 계 된 레이아웃 파일 레이아웃 에 따라 convertView 값 을 부여 하지 않 습 니 다.
              convertView 의 각 View 컨트롤 을 연결 하기 위해 view Holder 를 만 듭 니 다.convertView 의 setTag 로 view Holder 를
              시스템 이 두 번 째 로 ListView 를 그 릴 때 태그 에서 꺼 낼 수 있 도록 태그 에 설정 합 니 다.
                      따라서 세 번 째 방식 으로 ListView 를 최적화 하 는 것 을 권장 합 니 다!             관련 참고:
             http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html
             프로그램 전체 소스 코드:
            http://download.csdn.net/detail/kiritor/5134811
              
            

좋은 웹페이지 즐겨찾기