我试图实现ViewHolder模式,以便在绘图上绘制地图时提高性能.
我需要为我的标记创建一些标签.在draw()中的数据处理中调用此方法
我需要为我的标记创建一些标签.在draw()中的数据处理中调用此方法
// now we create label view and convert it into bitmap private Bitmap createLabelBitmap(GisLaborHistoryObject object,HistoryPoint point) { // create view from xml if (vh == null) { vh = new ViewHolder(); vh.view = inflater.inflate(R.layout.map_gis_history_label,null,false); vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext); } // set label content if (vh.tv != null) { if (!mSingleLaborHistory) { String name = ""; name = object.getDisplayName(); if (name == null || "".equals(name)) name = object.getPersonId(); if (name == null || "".equals(name)) name = object.getLaborCode(); if (name == null) name = ""; vh.tv.setText(name); } else vh.tv.setText(point.getChangeDate()); } // measure resulting view vh.view.measure(spec,spec); vh.view.layout(0,vh.view.getMeasuredWidth(),vh.view.getMeasuredHeight()); Bitmap b = Bitmap.createBitmap(vh.view.getWidth(),vh.view.getHeight(),Bitmap.Config.ARGB_8888); canvasToDraw.setBitmap(b); canvasToDraw.translate(-vh.view.getScrollX(),-vh.view.getScrollY()); vh.view.draw(canvasToDraw); return b; }
规格是
spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
结果是
logcat的:
04-29 17:12:34.057: E/AndroidRuntime(389): java.lang.NullPointerException 04-29 17:12:34.057: E/AndroidRuntime(389): at android.widget.TextView.checkForRelayout(TextView.java:5497) 04-29 17:12:34.057: E/AndroidRuntime(389): at android.widget.TextView.setText(TextView.java:2730) 04-29 17:12:34.057: E/AndroidRuntime(389): at android.widget.TextView.setText(TextView.java:2598) 04-29 17:12:34.057: E/AndroidRuntime(389): at android.widget.TextView.setText(TextView.java:2573) 04-29 17:12:34.057: E/AndroidRuntime(389): at com.xxx.android.proj.ui.map.overlays.LaborsMarkerOverlay.createLabelBitmap(LaborsMarkerOverlay.java:164)
我使用的XML布局
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gislabeltext" style="@style/labelStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="2dp" android:paddingRight="2dp" />
可能是这个错误的原因?
解决方法
在看到android
source code在5497行我注意到有一个检查使用mLayoutParams.我在调试模式下看起来就是这样,真的是空的!
我添加明确设置此参数的行.现在一切正常
我添加明确设置此参数的行.现在一切正常
vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext); vh.tv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
我的错误是,当使用ViewGroup膨胀时,我必须显式设置LayoutParams root = null;一切正常,直到我尝试重用TextView乘法时间.