Android ListView赢得了Kindle Fire的滚动

时间:2016-02-24 02:45:50

标签: android listview

在Kindle Fire HD 7 KFTT等旧设备上滚动列表视图是否有任何困难,可能是由于内存不足造成的?

如果是这样,你可以用什么方式对抗它?我已经在使用ViewHolder模式了。

public class StaffAdapter extends BaseAdapter implements StickyListHeadersAdapter, Filterable {

List<StaffItem> items;
List<StaffItem> itemList;
private final Context context;
Typeface face1;
Typeface face;
ValueFilter valueFilter;
String headerText;

public StaffAdapter(Context context, List<StaffItem> items1) {
    this.itemList = items1;
    items=items1;
    this.context = context;
    face1= Typeface.createFromAsset(context.getAssets(), "font/Roboto-Thin.ttf");
    face = Typeface.createFromAsset(context.getAssets(), "font/Roboto-Regular.ttf");
}
@Override
public int getCount() {
    return itemList.size();
}
@Override
public Object getItem(int position) {

    return itemList.get(position);
}
@Override
public long getItemId(int id) {
    return id;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView==null) {
        holder = new ViewHolder();
        convertView = View.inflate(context, R.layout.rss_item2, null);
        holder.itemTitle1 = (TextView) convertView.findViewById(R.id.textView1);
        holder.itemTitle = (TextView) convertView.findViewById(R.id.textView);
        holder.itemTitle5 = (ImageView) convertView.findViewById(R.id.imageview);
        convertView.setTag(holder);
        holder.itemTitle.setTypeface(face);
        holder.itemTitle1.setTypeface(face1);
    } else{
        holder= (ViewHolder) convertView.getTag();
    }
    StaffItem item = itemList.get(position);
    holder.itemTitle.setText(item.getName());
    holder.itemTitle1.setText(item.getAffiliation());

    if (item.getDepartment()) {
        holder.itemTitle5.setImageResource(R.drawable.dccopy);
    } else {
        holder.itemTitle5.setImageResource(R.drawable.staffbackground);
    }
    return convertView;
}

@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
    HeaderViewHolder holder;
    if (convertView == null) {
        holder = new HeaderViewHolder();
        convertView = View.inflate(context, R.layout.stafflistviewtextheader, null);
        holder.itemTitle = (TextView) convertView.findViewById(R.id.text);
        if (face1!=null)
            holder.itemTitle.setTypeface(face1);
        convertView.setTag(holder);

    } else {
        holder = (HeaderViewHolder) convertView.getTag();
    }
 //set header text as first char in name
    headerText = itemList.get(position).getStafDepartment();
    holder.itemTitle.setText(headerText);
    return convertView;
}

@Override
public long getHeaderId(int i) {
    return itemList.get(i).getStafDepartment().subSequence(0,3).charAt(2);
}


class HeaderViewHolder {
    TextView itemTitle;
}

static class ViewHolder {
    TextView itemTitle;
    TextView itemTitle1;
    ImageView itemTitle5;
}}

2 个答案:

答案 0 :(得分:1)

问题是由于您的Adapter调用setImageResource()。这会在UI线程上进行Bitmap读取和解码,这可能会导致问题。

您需要实现一个位图缓存哈希列表,您可以引用该列表以减少对setImageResource的调用次数。这会将位图直接存储在内存中,并减少读取/解码工作。

之前我遇到过这个问题并提供了一个实施示例: Complex example of ListView getItemViewType()

答案 1 :(得分:0)

从您在此处公开的代码中我可以看到您正在创建内存泄漏。

您将保留适配器中的上下文(private final Context context;),该适配器将存在于该上下文中。这种双向性会造成内存泄漏,而这两者都无法清理。当在其他地方重复这种情况时,你的应用程序会迅速开始通过内存来解释,这可以解释为什么应用程序会变得无法响应。

您还复制了项目列表。在上面的代码中,您似乎没有理由这样做。

List<StaffItem> items;
List<StaffItem> itemList;

this.itemList = items1;
items=items1;

最后要注意的是很少出现问题,但是您正在设置一些图像资源。看看这些图像资源,看看它们有多大。如果您不小心使用了非常大的图像并且从适配器一次显示了几个图像,这也会消耗大量内存。