一、优势
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/n/144514.html