我的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"
但是从普通视图到列表视图的视图变化很慢,列表也在滚动。
答案 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的对象的初始化只是你列表的第一个元素。然后它总是在其他地方抓住以前的设置。