2011-10-30 3 views
2

각 목록 항목에 클릭 가능한 이미지가 하나 이상 포함될 수있는 목록보기가 있습니다. 이미지를 클릭하면 이미지의 전체 화면 버전을 보여주는 활동이 시작됩니다.OnClickListeners가 지속적으로 실행되지 않음

다음 코드 (약간 단순화)는 각 ListItem의 각 이미지에 대해 GetView() 구현 내에서 OnClickListeners을 설정합니다. 이것은 완벽하게 작동했습니다.

ImageView imageView = (ImageView)convertView.findViewById(R.id.image_res); 
imageView.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ActivityLauncher.startPhotoViewerActivity(mContext, item); 
    } 
}); 

그러나 성능을 향상시키기 위해 처음으로 구성한 후 각보기를 메모리에 저장하기로 결정했습니다. 저는 convertView을 사용하는 대신 4-5 가지 유형의 뷰가 있기 때문에 코드를 동적으로 구성하여 재사용하기가 어렵습니다.

뷰를 메모리에 저장하고 위치를 기준으로 getView()을 호출하는 동안 이미 생성 된 뷰를 반환하면 성능이 크게 향상되지만 OnClickListeners은 펑키 동작을 시작합니다.

특히, 주어진 이미지를 두드리면 그것에 대한 OnClickListener이 즉시 실행되거나 전혀 실행되지 않을 수 있습니다. 즉시 발사되지 않는 경우, 스크롤을 시작하자 마자 발사 될 수 있습니다. 이 작업으로 OnClickListener이 실행되지 않으면 뒤로를 클릭하여 활동을 종료하면 해당 활동이 트리거 될 수 있습니다. 이것이 실행되지 않으면 BACK을 눌러 모든 활동을 닫은 다음 앱을 다시 입력하면 대기중인 모든 항목이 실행됩니다. OnClickListeners. 한 가지 경우에 나는 결과없이 다양한 이미지에서 25 번을 클릭했습니다. 그런 다음 모든 활동을 닫은 다음 다시 한 번 응용 프로그램 아이콘을 클릭하여 25 개의 이미지 미리보기를 모두 열었습니다.

이 문제의 원인은 무엇입니까? 흥미로운 것은 OnClickListeners이 어떤 시점에서 사진 뷰어 활동을 열어 분명히 올바르게 설정되어 있다는 것입니다. 잘못된 이미지는 결코 열리지 않으며 절대로 절대 발사하지 않습니다. 문제는 즉시 또는 나중에 발사 될 수 있다는 것입니다.

각 목록 항목의보기를 저장하고 내가 수행하는 것처럼 getView()의 위치를 ​​기반으로하여 반환하지 않는 것이 좋습니까? 어떤 도움이라도 대단히 감사합니다.

+1

전체'getView()'메소드를 게시해야합니다. 그렇지 않으면이 특정 동작이 발생하는 이유를 진단하기가 매우 어려울 것입니다. – dmon

답변

3

Google I/O에서 제공되는 ListView에 대한 토론을 시청하십시오. 13시 45 분에 뷰를 캐싱하고 반환하는 것에 대해 특별히 경고합니다. 사람이 이것을하면 이상한 행동으로 이어질 수 있으며 이는 정확히 내가 경험하고있는 행동입니다. 이 점을 고려할 때 문제는 의문의 여지가 있습니다.

http://www.youtube.com/watch?v=wDBM6wVEO70

희망이 미래에 누군가가 같은 함정을 방지 할 수 있습니다. 캐싱 뷰는 권장되지 않습니다 !!!