我有自定义列表视图。当我滚动我的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;
}
答案 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。总的来说,我认为这样做会有更好的表现。