一、优势
Javaholder是一个非常方便的工具类,可以大大简化代码,提高开发效率。具体来说,它有以下几个优势: 1、方便快捷的ViewHolder创建
// 使用javaholder
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
...
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<View> mViews = new SparseArray<View>();
private View mConvertView;
public Javaholder(View convertView) {
mConvertView = convertView;
}
public View getConvertView() {
return mConvertView;
}
protected <T extends View> 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对象。每当需要获取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时应尽量避免进行多次反射操作。