我遇到一个问题,我没有在stackoverflow上找到任何解决方案(或到目前为止的任何其他地方)。
摘要:
我有滚动视图,里面有一个能见度消失的ListView(可以用TextView切换)。
当我设置适配器内容时,在我的活动中onScroll get调用4个可见项但是适配器的getView调用整个dataSet(181个项目),这带来了很多性能问题/ imageref_ashmem创建失败.. 。(当然删除图像加载删除创建失败但很好:D)
===活动===
onScroll中的活动结果
firstVisibleItem 0
visibleItemCount 4
totalItemCount 181
===布局提取===
<ScrollView
android:id="@+id/UserProfileView_ScrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:background="#00FFFFFF" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00FFFFFF" >
<RelativeLayout
android:id="@+moreDetails/UserProfileView_BottomLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_below="@+profile/UserProfileView_MoreDetails"
android:background="#FFFFFFFF" >
<TextView
android:id="@+id/UserProfileView_About"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#ff111111"
android:visibility="gone" />
<ListView
android:id="@+id/UserProfileView_MoreDetails_ListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:footerDividersEnabled="false"
android:divider="@color/unactivatedLightGray"
android:dividerHeight="1dp"
android:listSelector="@android:color/transparent"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
</ScrollView>
BottomLayout的高度以编程方式设置为屏幕宽度的3/4。
===适配器===
public class CommonAdapter extends BaseAdapter {
public List<Common> list;
private LayoutInflater inflater;
private AQuery aq;
public CommonAdapter(Context context, List<Common> list) {
this.inflater = LayoutInflater.from(context);
this.list = list;
this.aq = new AQuery(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
ImageView thumbImg;
TextView name;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_view_item, null);
holder.thumbImg = (ImageView) convertView.findViewById(R.id.CommonCell_Thumb);
holder.name = (TextView) convertView.findViewById(R.id.CommonCell_Name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Common obj = list.get(position);
if (list.get(position).getPicture() != null)
aq.id(holder.thumbImg).image(obj.getPicture());
else
aq.id(holder.thumbImg).image(Util.Thumb(list.get(position).getId()), options);
holder.name.setText(obj.getName());
return convertView;
}
}
编辑:每次滚动时,它会再次解析整个数据集,因此181调用getView。
答案 0 :(得分:1)
我假设你的aq.id(stuff)
加载图片是异步的。
如果是这样,请检查layout/list_view_item.xml
它的高度可能设置为wrap_content
,而ImageView
也没有固定的高度。加载图像时的含义此行具有零或非常小的高度。因此,所有182行一次适合ListView,并且每个单独调用getView()。
为每一行设置一个固定的height
或minHeight
,或者ImageView
ListView只会调用getView()
,因为适合ListView的行数。
希望这有帮助
答案 1 :(得分:1)
我通过将ListView设置为任意高度来解决问题。
<ListView
android:id="@+id/UserProfileView_MoreDetails_ListView"
android:layout_width="match_parent"
android:layout_height="1080dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:footerDividersEnabled="false"
android:divider="@color/unactivatedLightGray"
android:dividerHeight="1dp"
android:listSelector="@android:color/transparent"
android:visibility="gone" />
答案 2 :(得分:0)
如果在ScrollView中使用ListView或RecyclerView,则所有项目将同时启动。