一、優勢
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