2016-06-20 3 views
-1

리사이클 뷰는 새로운 것이지만 목록보기에서 2 코드의 차이점을 알고 싶습니다. 나는 이미 많은 것을 찾으려고했지만 특정한 대답을 얻지 못했습니다. 내가 아는 첫 번째는 메모리 소비 때문에 두 번째 더 빠르다. 그러나 두 번째 코드가 느린 이유는 무엇이며, 첫 번째 코드는 내부 프로세스가 무엇인지를 이해할 수있다.리스트 뷰 어댑터의 2 코드 간의 차이점은 무엇입니까?

이 첫 번째 코드

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 


final HashMap<String ,String > item = lst.get(position); 
      ViewHolderItem viewHolder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false); 

      viewHolder = new ViewHolderItem(); 
      viewHolder.title = (TextView)convertView.findViewById(R.id.item_name); 
      viewHolder.msg = (TextView)convertView.findViewById(R.id.message); 

      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (ViewHolderItem) convertView.getTag(); 
     } 
     viewHolder.title.setText(item.get(Const.USERNAME)); 
     viewHolder.msg.setText(item.get(Const.GET_MESSAGE)); 
     return convertView; 
    } 

이 두 번째 코드

@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 

final HashMap<String ,String > item = lst.get(position); 
      ViewHolderItem viewHolder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false); 

      viewHolder = new ViewHolderItem(); 
      viewHolder.title = (TextView)convertView.findViewById(R.id.item_name); 
      viewHolder.msg = (TextView)convertView.findViewById(R.id.message); 

     } 
     viewHolder.title.setText(item.get(Const.USERNAME)); 
     viewHolder.msg.setText(item.get(Const.GET_MESSAGE)); 
     return convertView; 
    } 

답변

0

번째 예는보기의 경우 생성 된 뷰의 태그로서 viewHolder 저장에 대한 부분이 누락되어있다에게 인 비정상적으로보기가 이미 존재하는 경우 viewHolder을 재사용하면됩니다.

0

목록보기 항목은 언제든지 다시 만들어집니다. (이것은 위아래로 스크롤 할 때 발생합니다). ListView이 항목을 다시 만들어야 할 때마다 필요한 위치로 어댑터의 getView()을 호출합니다. getView() 메서드 내에서 해당 위치에 필요한 View 항목을 생성하는 논리가 있습니다.

View을 XML 내부에서 찾는 데 사용하는 findViewById() 메서드는 CPU가 광범위합니다. XML에 긴 시퀀스의 자식이 있고 getView()findViewById() 호출이 많이 포함되어있는 경우 상당한 지연이 발생할 수 있습니다.

ViewHolder를 사용하면 편리합니다. ViewHolder는 View 항목을 보유 할 수있는 클래스입니다. 매번 findViewById()을 호출하는 대신 이미 생성 된 ViewHolder 객체를 사용할 수 있습니다.

이 기능을 사용하려면 특정 위치와 관련된 ViewHolder 객체를 저장해야합니다. 너는 이렇게 해.

ViewHolder viewHolder; 
if(convertView==null){ 
    //the view is created for the first time 
    //you have to make the View HOlder object here 
    viewHOlder=new ViewHOlder(convertView); 
    //ViewHOlder constructor can find the required view elements and store it in variables 
    //now you have to save this View Holder object for future reference 
    //you save it as a tag 
    convertView.setTag(viewHolder); 
} 

이제 특정 항목 위치에 대한 정의 된보기 보유자가 있습니다. 다음은 다시 사용하는 방법입니다. ListView 어댑터를 다시 사용하도록 설정하면 에 getItem()이 지정되면 null이 아닙니다. 그래서 재사용은 ifelse 진술에서 발생합니다.

else{ 
    //you already have a pre created View holder. Retrieve it. 
    viewHOlder=(ViewHolder)convertView.getTag(); 
    //now you can get access to your View elements easily 
} 

두 번째 예에서는 ViewHOlder를 만들었지 만 다시 사용하지는 않습니다. 그래서 그것은 개선되지 않습니다.

+0

Malith Lakshan에게 감사드립니다.이 비디오에 대한 내 질문은이 비디오에서 볼 수 있습니다. 두 코드가 맞다고 말하고 있지만 왜 첫 번째 것이 더 빠릅니까? 이걸 보시기 바랍니다. https://www.youtube.com/watch?v=wDBM6wVEO70 – Nitish