2012-02-17 2 views
1

이 코드 내 목록보기위한 사용자 정의 BaseAdapter 있습니다스크롤의 ListView는 매우 느립니다

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) 
    { 
    } 
    else 
    { 
    holder = (ViewHolder) convertView.getTag(); 
    } 
    convertView = mInflater.inflate(R.layout.user_submissions_customisation, null); 
    holder = new ViewHolder(); 
    holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName); 
    holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle); 
    holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate); 
    holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage); 
    holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage); 
    holder.statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage); 
    convertView.setTag(holder); 

    ImageView statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage); 
    ImageView statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage); 
    ImageView statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage); 

    MDPIActivity mdpi = new MDPIActivity(); 
    Context context =mdpi.getContext(); 
    LocalDatabase localDatabase = new LocalDatabase(context); //Instantiation of the DB 
    int status = localDatabase.getSubmissionStatus(position+1); 

    if (status==102 | status==19) 
    { 
     statusRejected.setVisibility(View.VISIBLE); 
    } 
    else 
    { 
     if (status==29) 
     { 
     statusOk.setVisibility(View.VISIBLE); 
     } 
     else 
     { 
      statusProcessing.setVisibility(View.VISIBLE); 
     } 
    } 

    holder.JournalName.setText(submissionsArrayList.get(position).getJournalTitle()+"-"+submissionsArrayList.get(position).getID()); 
    holder.SubmissionTitle.setText(submissionsArrayList.get(position).getTitle()); 
    holder.SubmissionDate.setText(submissionsArrayList.get(position).getDate()); 

    return convertView; 
} 

static class ViewHolder { 
    TextView JournalName; 
    TextView SubmissionTitle; 
    TextView SubmissionDate; 
    ImageView statusOk; 
    ImageView statusRejected; 
    ImageView statusProcessing; 
} 

모든 아지만 디스플레이에있는 목록의 작성을 작동하고 스크롤 매우 느린입니다. 내가 너무 EY 목록이 사용 :

android:fastScrollEnabled="true" 
android:scrollingCache="true" 
android:smoothScrollbar="true" 

그러나 목록보기에 previeous보기에서 변경보기가 느리고 너무 목록의 스크롤입니다.

답변

1

떨어져 먼저 어댑터를 사용하지 않는

convertView = mInflater.inflate(R.layout.user_submissions_customisation, null); holder = new ViewHolder(); holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName); holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle); holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate); holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage); holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage); holder.statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage); convertView.setTag(holder);

"을보기가 null 변환"때 경우 조건이 코드를 이동
이 일을 당신이했던 것처럼 코딩하여 효율적으로.
위의 방법으로 성능이 향상됩니다.

간단히 말해 변환보기가 null 일 때만 목록 행의보기를 확장해야합니다.
또한 행 뷰의 다른 뷰는 convertView 자체로 초기화해야합니다.
그러면 홀더보기가 변환보기의 태그로 설정되고 어댑터는 매번 새로운보기를 부풀게하지 않고 동일한보기를 계속 제공합니다.

편집 : 컨텍스트를 가져오고 getView() 메서드에서 db를 인스턴스화하기위한 코드를 이동해야합니다.
어댑터 클래스에서 클래스 수준의 변수 "mContext"를 만들고 어댑터의 생성자에서 액티비티의 컨텍스트를 전달하여 인스턴스를 생성하면됩니다.
그런 다음 같은 위치 (생성자)에서 db도 인스턴스화합니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if (convertView == null) 
     { 
     convertView = mInflater.inflate(R.layout.user_submissions_customisation, null); 
     holder = new ViewHolder(); 
     holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName); 
     holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle); 
     holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate); 
     holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage); 
     holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage); 
     holder.statusProcessing=ImageView)convertView.findViewById(R.id.statusProcessingImage); 
     convertView.setTag(holder); 
     } 
     else 
     { 
     holder = (ViewHolder) convertView.getTag(); 
     } 

    ... 
} 

이 방법, 소유자의 객체의 당신의 초기화가 그냥 항상 이전 설정을 잡는에서 다른하게 될 list.then의 첫 번째 요소에 대해 다음과 같습니다

+0

감사합니다 akkilis, 문제는 지금 내가 scrooling 때 요소 위치가 변경되고 내가 어떤 정보에 대한 내 if 조건에이 정보를 사용한다는 것입니다. –

+0

사실은 변하지 않지만 변경된 것 같습니다. – akkilis

+0

이것은 행의 모든 ​​요소에 대해 데이터를 설정하지 않았고 해당 요소가 이전 행에 일부 데이터로 존재하는 경우 변환보기를 다시 사용하기 때문에 동일하게 표시되기 때문입니다. – akkilis

0

항상 convertView를 부 풀리시겠습니까? 뷰가 null이 아닌 경우 원하는대로 뷰를 변경하고 뷰를 다시 팽창시키지 않아야합니다. 의 getView에게 의 상단에 다음과 같은 코드를 사용 모든

if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.user_submissions_customisation, null); 
} else { 
    //convertView is already inflated. No inflate it again! 
    holder = (ViewHolder) convertView.getTag(); 
} 
holder = new ViewHolder(); 
holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName); 
+0

해야 할 일 "holder = new ViewHolder();" 이미 전환보기의 태그로 사용하고 계신가요? 내 견해로는, 이것을하는 것은 쓸모가 없다. – akkilis

+0

akkilis와 같은 문제는 scrooling 할 때 요소 위치가 바뀌고 일부 이미지의 if 조건에서이 정보를 사용합니다. –

0

이 시도.

+0

고맙습니다. 내가 Akkilis의 도움으로 해결 한 위치 문제. –