具有自定义BaseAdapter的可滚动ListView非常慢

时间:2012-02-17 07:01:48

标签: android listview android-view

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

一切正常,但在显示屏上创建列表和滚动非常慢。 我也将它用于éy列表:

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

但是从普通视图到列表视图的视图变化很慢,列表也在滚动。

3 个答案:

答案 0 :(得分:1)

所有分开首先做这件事
当“转换视图为空”时将此代码移到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”,并通过传递活动的上下文在适配器的构造函数中实例化它。
然后在同一个地方(构造函数)实例化db。

答案 1 :(得分: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);

答案 2 :(得分: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();
      }

   ...
}

这样,你对holder的对象的初始化只是你列表的第一个元素。然后它总是在其他地方抓住以前的设置。