Прокручиваемый ListView с настроенным BaseAdapter очень медленный - PullRequest
1 голос
/ 17 февраля 2012

У меня есть настроенный 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;
 }

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

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

Но представление, изменяющееся с преобладающего представления на представление списка, медленное, и прокрутка списка тоже.

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Сначала все это сделайте сначала
Переместите этот код в условие if, когда "конвертировать представление пусто"

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

Вы не используете адаптер эффективно при кодированиикак и вы.
Указанный выше способ наверняка улучшит производительность.

В двух словах, вы должны увеличивать представление строки списка только тогда, когда представление преобразования равно нулю.
Кроме того, различные представления в представлении строки должны быть инициализированы самим convertView.
Затем вы задаете представление держателя в качестве тега для представления преобразования, и адаптер будет непрерывно предоставлять одно и то же представление вместо того, чтобы каждый раз надувать новое.время.

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

0 голосов
/ 17 февраля 2012

попробуйте это:

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

   ...
}

Таким образом, ваша инициализация объекта держателя будет просто для первого элемента вашего списка. Тогда он всегда будет в другом месте, захватывая предыдущие настройки.

0 голосов
/ 17 февраля 2012

Почему вы всегда надуваете convertView? Если view не равен 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...