如何将列表项保留在内存中?

时间:2012-05-31 21:26:56

标签: android

我有自定义列表视图。当我滚动我的listview时,android保留在内存中(据我所知)在屏幕上显示的项目并不保留隐藏(不滚动到)的项目。

在我的情况下(我认为)保留所有列表项目比生成隐藏项目更好。

那么,如何“告诉”android将所有项目保存在内存中? (15-20项)。 PS:如果浪费资源,我只想尝试一下。

我的适配器(一些功能):

private View newView(Context context, ViewGroup parent) {
  LayoutInflater layoutInflater = LayoutInflater.from(context);
  return layoutInflater.inflate(R.layout.myl,parent,false);
}
public View getView(int position,View convertView,ViewGroup parent) {
  View view=null;
  if(convertView!=null) view=convertView; else view=newView(context,parent);
  HashMap<String,String> d=new HashMap<String,String>();
  d=data.get(position); 
  String qweqwe=d.get("qweqwe"); //9 more lines like this.
  TextView txt=(TextView)view.findViewById(R.id.mfmf); //
  txt.setText(qweqwe); //
  txt.setTypeface(mlf); //5 more blocks of 3 lines like this.
  if (smth.equals("0")){
    view.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.mvmv));
  } else {
    view.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.mvmv2));
  }
  return view;
}

2 个答案:

答案 0 :(得分:2)

好的..这里有一些可以优化的东西,而不是试图通过变通方法修复滞后:)

您应该实现一个静态类,您可以在其中存储对myl.xml中的Views的引用。对于要在myl.xml中操作的每个View,可以在此静态类中创建View。因此,如果您有10个TextView,则使用10个TextView填充此类。

static class AdapterViewsHolder {
    TextView txt1;
    TextView txt2;
    TextView txt3;
    ...
    ImageView img1;
    ... etc etc.
}

在适配器中,如果convertView为null,则现在只执行findViewById()调用。 findViewById()并不便宜,因此限制通话量会提高性能。

private HashMap<String, String> mData;
private LayoutInflater mInflater;
private TypeFace mCustomTypeFace;

// Some contructor for passing data into the Adapter.
public BaseAdapter(HashMap<String, String> data, Context ctx) {
    mData = data;
    mInflater = LayoutInflater.from(ctx);
    mCustomTypeFace = Typeface.createFromAsset(ctx.getAssets(), "yourTypeFace.ttf");
}

public View getView(int position, View convertView, ViewGroup parent) {
    // This AdapterViewsHolder will hold references to your views, so you don't have to 
    // call findViewById() all the time :)
    AdapterViewsHolder holder;

    // Check if convertView is null
    if(convertView == null) {
        // If it is, we have to inflate a new view. You can probably use the newView() call here if you want.
        convertView = mInflater.inflate(R.layout.myl, null);

        // Initialize the holder
        holder = new AdapterViewsHolder();

        // Now we do the smart thing: We store references to the views we need, in the  holder. Just find all the views you need, by id.
        holder.txt1 = (TextView) convertView.findViewById(R.id.textview1);
        holder.txt2 = (TextView) convertView.findViewById(R.id.textview2);
        ...
        holder.img1 = (ImageView) convertView.findViewById(R.id.imageview1);

        // Store the holder in the convertViews tag
        convertView.setTag(holder);
    }
    else {
        // If convertView is not null, we can get get the holder we stored in the tag.
        // This holder now contains references to all the views we need :)
        holder = (AdapterViewsHolder) convertView.getTag();
    }



    // Now we can start assigning values to the textviews and the imageviews etc etc
    holder.txt1.setText(mData.get(position));
    ...
    holder.txt1.setTypeface(mCustomTypeFace);
    ...
    holder.img1.setImageResource("IMAGE RESOURCE HERE");  

    if(someThing.equals("sometext") {
         convertView.setBackgroundDrawable(somedrawable);
    }
    else {
         convertView.setBackgroundDrawable(someotherdrawable);
    }

    // Finally, we return the convertView
    return convertView;
}

我不知道您的数据是如何组织的,因此您必须稍微更改此代码。

可能导致延迟的另一件事是android:cacheColorHint xml属性。通常将此设置为与应用程序背景相同的颜色或透明。众所周知,将其设置为透明会在某些情况下导致快速垃圾收集。

答案 1 :(得分:0)

您可以覆盖适配器并让它为构造函数中的所有视图充气,然后使用getView()返回正确的视图。如果将视图存储在某个数据对象(数组,列表等)中,可能会很容易。

但实际上你应该让系统像设计一样使用convertView。总的来说,我认为这样做会有更好的表现。