2012-01-09 3 views
0

ListView 용으로 직선적 인 BaseAdapter가 있습니다. JSON 피드를 다운로드하고 행에 데이터를 표시합니다. 뷰와 "Story"라는 데이터 객체가 포함 된 ViewHolder가 있습니다. 모든 것이 잘 작동합니다.convertView를 재활용 할 때 ListView 어댑터가 혼동 스럽습니다.

그러나 긴 목록을 스크롤 한 후에 두 가지 사실을 알았습니다.

1) 내 로그는 어댑터가 아래로 스크롤 할 때 피드를 다시로드하고 있음을 나타냅니다. 이것은 전체 JSON 배열을 변수에 넣었 기 때문에 이상합니다. 왜 다시로드해야합니까?

2) 더 중요한 것은 앞뒤로 스크롤 한 후에 행에 잘못된 "Story"개체가 들어 있다는 것입니다. 다음은 getView 루틴의 관련 부분입니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    Story story = stories.get(position); 
    if (convertView == null) { 
     //create holder 
     holder = new ViewHolder(); 
     convertView = inflator.inflate(R.layout.story_list_item, parent, false); 
     holder.titleView = (TextView) convertView.findViewById(R.id.story_list_title); 
     holder.dateView = (TextView) convertView.findViewById(R.id.story_list_date); 
     holder.story = story; 
     holder.imageView = (ImageView) convertView.findViewById(R.id.story_list_image); 
     convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     }  
    // configure the view  
    holder.titleView.setText(story.title); 
    return convertView; 
} 

충분히 간단합니다. 이제 이상한 것은 if 문을 제거하여 문제를 해결할 수 있다는 것입니다. if (convertView == null) (행 재활용도 제거합니다).

하지만이 방법으로 메모리 문제가 발생하지 않습니까? 왜 일반 바닐라 버전이 작동하지 않습니까?

도움 주셔서 감사합니다. 감사 S

+0

JSON 피드를 다운로드하는 위치가 표시되지 않지만 빠르게 스크롤하면 첫 번째 피드가 다운로드되기 전에보기가 재생됩니다. 그런 다음 두 번째 피드의 다운로드가 시작되고 처음 다운로드가 완료되면 첫 번째 다운로드가 완료되면 어떤 의미에서 '덮어 쓰기'될 수 있습니다. http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – danh32

+0

감사합니다. 나는 그것을 분명히 추구 할 것입니다. . – Mundi

답변

1

당신은 당신은 단지

holder.story = story 
convertView == null

을 할당하고 있음을 알고있다? convertView 케이스 바로 뒤에 holder.story = story을 입력하는 것이 좋습니다. 그러면 더 잘 작동합니다. Btw, 당신은 심지어 당신의 뷰 홀더 안에 "스토리"를 저장할 필요가 있습니까? 일반적으로이 패턴은 실제 위치의 데이터가 아니라 뷰를 저장하고 상태 정보를 보는 데에만 사용해야합니다.

+0

그게 다예요. 고마워요. 그러나 ** 실제로 ** 데이터를 전송하는 방법은 무엇입니까? 다양한 텍스트보기 등의 텍스트처럼? 이미지보기 URL을 다른보기에서로드하는 방법은 무엇입니까? 다시 한번 감사드립니다. – Mundi

+0

활동간에 전송 하시겠습니까? ContentProvider를 사용하는 경우 일반적으로 클릭 된 항목에 대해 Uri를 전달합니다. JSON의 경우 인텐 트 추가 정보 (사례에서 "이야기"배열로 채워짐)에 관련 정보를 보냅니다. Story 용 Parcelable을 구현하거나 'Bundle'엑스트라에 작성하여 Intent로 전송하십시오. – Jens

+0

그게 내가하고있는 일이야. 엑스트라 번들에있는 데이터를 보내는거야. 하지만 필자는 Parcelable이 진정한 고통과 오류로 가득 찬 것으로 알았습니다. 제대로 작동하지 못했습니다. 그래서 저는 많은 스토리 라인을 사용하여 각 스토리를 보내고 있습니다 ... iOS에서 제공되는이 코드는 실제로 매우 어색합니다. – Mundi

관련 문제