2015-01-31 10 views
1

ListView 및 리스너에 대한 질문이 있습니다. 내 앱에 listview가 있다고 가정 해 보겠습니다. 각 항목에는 체크 박스가 있습니다. 그리고 난 다음 코드를했습니다 :여러 청취자

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

    CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox); 

    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // some code 
     }    
    }); 

} 

의 getView 메서드를 호출 할 때 당신은 내가 setOnCheckedChangeListener마다 시간을 설정할 볼 수 있듯이. 청취자를 설정하는 올바른 방법은 무엇입니까? 아니면 한 번 설정해야합니까? 성과 측면에서 나쁜가요? 아니면 상관 없습니까? 이전 청취자를 덮어 쓸지 여부를 청취자를 여러 번 설정했거나이 이벤트의 청취자가 여러 명 있습니까?

답변

1

성능 측면에서 좋지 않습니까? 아니면 상관 없습니까?

중요하지 않습니다. 설정자는 객체를 할당합니다.

그리고 나는 그것이 이전 수신기를 덮어 쓰게됩니다 또는 내가이 이벤트에 대한 리스너를 여러 개 가질 것인지 청취자 여러 번 설정하면?

setOnCheckedChangeListener이라는 체크 박스의 각 인스턴스마다 하나씩 만 표시됩니다. ListView은 재활용 메커니즘으로 인해 특별한 경우입니다

1

설정 한 각 수신기는 이전 수신기를 덮어 씁니다 (있는 경우).
청취자를 설정하거나 다른 것을 설정하면 시간이 많이 소모되지만 여기에서는 새로운 익명 클래스를 생성하므로 시간이 오래 걸립니다. findViewById 견해 배수를 방지하기

  • 사용 ViewHolder 패턴을 캐시

    1. 사용 convertView
    2. 를 사용하여 모든 체크 박스에 대해 하나의 리스너를 호출 : 최대 성능을 위해

      , 나는 몇 가지 조정을 할 것 캐시 된보기에서만 설정하십시오 (convertView == null)

    3. CheckBox가있는 항목의 위치를 ​​CheckBox의 태그로 저장하십시오.

    다음은 예입니다 :

    private static class ViewHolder { 
        CheckBox checkBox; 
    } 
    
    private CompoundButton.OnCheckedChangeListener mCheckListener = new CompoundButton 
         .OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
         Log.e("TAG", "CheckBox position: " + buttonView.getTag()); 
        } 
    }; 
    
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        ViewHolder holder; 
        if (convertView == null) { 
         /* Inflate the layout here */ 
    
         holder = new ViewHolder(); 
         holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 
         /* Find other views in you layout here */ 
    
         holder.checkBox.setOnCheckedChangeListener(mCheckListener); 
         // Set the holder as tag, so you can fetch it later for re-use 
         convertView.setTag(holder); 
        } else { 
         // Fetch the holder 
         holder = (ViewHolder) convertView.getTag(); 
        } 
    
        // Set the checkbox position 
        holder.checkBox.setTag(position); 
    
        return convertView; 
    } 
    

    당신이 convertViews을 사용하고 ViewHolder 패턴은 당신이 모든 것을 설명하는 The World of ListView을주의해야 익숙하지 않은 경우.