2012-02-17 2 views
1

У меня есть настроенный BaseAdapter для моей ListView с этим кодом:прокрутка ListView с настраиваемым BaseAdapter очень медленно

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; 
} 

Все работает WEL, но создание списка на экране и прокрутка происходит довольно медленно. Я использовал это для EY списка тоже:

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

Но вид меняется от previeous вида на ListView медленно и прокрутка списка тоже.

ответ

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.
Кроме того, различные представления в представлении строки должны быть инициализированы самим преобразованием.
Затем вы устанавливаете вид держателя в качестве метки для конвертируемого вида, и адаптер будет постоянно обеспечивать один и тот же вид, а не раздувать новый каждый раз.

Редактировать: Вы должны переместить код для получения контекста и создания экземпляра db из метода getView().
Просто введите переменную класса «mContext» в свой класс адаптера и создайте экземпляр в конструкторе вашего адаптера, передав контекст активности.
Тогда в том же месте (конструктор) создайте экземпляр db.

+0

Спасибо, akkilis, проблема в том, что позиция элементов меняется, когда я выполняю scrooling, и я использую эту информацию в моем состоянии if для некоторых изображений. –

+0

его не меняется, но, похоже, меняется. – akkilis

+0

это потому, что если для любого элемента строки вы не задали данные и этот элемент присутствовал в предыдущей строке с некоторыми данными, он будет отображаться одинаково, потому что теперь вы повторно используете представление конвертации. – akkilis

0

Почему вы всегда раздуть конвертировать? Если view not 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

попробовать это:

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. –

Смежные вопросы