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
JSON 피드를 다운로드하는 위치가 표시되지 않지만 빠르게 스크롤하면 첫 번째 피드가 다운로드되기 전에보기가 재생됩니다. 그런 다음 두 번째 피드의 다운로드가 시작되고 처음 다운로드가 완료되면 첫 번째 다운로드가 완료되면 어떤 의미에서 '덮어 쓰기'될 수 있습니다. http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – danh32
감사합니다. 나는 그것을 분명히 추구 할 것입니다. . – Mundi