一、優勢
Javaholder是一個非常方便的工具類,可以大大簡化代碼,提高開發效率。具體來說,它有以下幾個優勢:
1、方便快捷的ViewHolder創建
// 使用javaholder
public class MyAdapter extends RecyclerView.Adapter {
...
public static class ViewHolder extends Javaholder {
TextView textView;
ImageView imageView;
public ViewHolder(View itemView) {
super(itemView);
textView = $(R.id.textview);
imageView = $(R.id.imageview);
}
}
...
}
相比傳統寫法,使用Javaholder可以使ViewHolder創建部分清晰明了。ViewHolder的成員變數只需要通過$(int resourceId)即可找到view,無需再使用findViewById。接著就可以在任意位置調用ViewHolder的成員變數,完全不用關心Finder的問題。
2、可讀性高的findViewById()替代方式
// 使用findViewById()
public class MyActivity extends Activity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
button = (Button) findViewById(R.id.button);
...
}
...
}
// 使用javaholder
public class MyActivity extends Activity {
private Javaholder holder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
holder = new Javaholder(this, R.layout.activity_main);
...
}
...
}
在Activity等類中,我們通常使用findViewById()來獲取View對象。然而,在複雜的布局中,使用findViewById會使代碼變得冗長。相比之下,Javaholder使用$()的方式更加優雅簡便。
3、無差異的兼容性
Javaholder可以在所有API級別的Android系統上使用,沒有兼容性問題。無論應用程序在哪種 Android 系統上運行,都可以使用Javaholder,無需修改代碼。
二、實現
Javaholder本質上是一個反射的工具類。具體實現方式大致如下:
public abstract class Javaholder {
private SparseArray mViews = new SparseArray();
private View mConvertView;
public Javaholder(View convertView) {
mConvertView = convertView;
}
public View getConvertView() {
return mConvertView;
}
protected T $(int resId) {
T view = (T) mViews.get(resId);
if (view == null) {
view = (T) mConvertView.findViewById(resId);
mViews.put(resId, view);
}
return view;
}
}
在Javaholder中,使用SparseArray來存儲View對象。每當需要獲取View對象時,先去SparseArray中查找,若為空則通過mConvertView.findViewById(resId)來查找,然後將該View對象存入SparseArray中。這樣,在每次使用ViewHolder時,就可以直接調用ViewHolder的成員變數引用view,避免重複調用findViewById方法。
三、適用範圍
Javaholder適用於所有需要使用到ViewHolder的Android應用程序。因為ViewHolder的使用基本上是Android應用程序的一個種規範。
四、使用建議
在使用Javaholder時,需要注意以下幾點:
1、Javaholder適用於布局文件中View較多的情況。
因為反射查找方式需要消耗額外的時間,在布局文件中View較少的情況下不推薦使用。
2、盡量避免在for循環中調用findViewById。
在適配器中使用ViewHolder時,需要避免在for語句中使用findViewById。儘管ViewHolder的優化可以避免不必要的findViewById調用,但在for語句中,還是會造成很大的性能開銷。
3、盡量避免進行過多的反射操作。
反射是一項非常消耗性能的操作,在使用Javaholder時應盡量避免進行多次反射操作。
原創文章,作者:YXQQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144514.html
微信掃一掃
支付寶掃一掃