下面具体一点说明问题。
这是自己继承RecyclerView.Adapter的类的onBindViewHolder方法,每项是一个imageview和一个textview,imageview我固定宽高都是100dp
public void onBindViewHolder(RecycleViewHolder viewHolder,int position)
{
String itemUri=uri.get(position);
String itemText=text.get(position);
TextView textView=viewHolder.textView;
ImageView imageView=viewHolder.imageView;
cacheLoader.load(itemUri, itemText, imageView,textView,position);
}
这里调用的load方法用于启动线程池,进行异步网络图片加载
public void beginToLoad(final ImageView imageView,final String uri,final String text,final TextView textView)
{
final int width=imageView.getWidth();
final int height=imageView.getHeight();
imageView.setTag(uri);
Runnable runnable=new Runnable() {
@Override
public void run() {
try {
Result result = loadResult(width, height, uri, text);
if (result != null) {
LoaderResult loaderResult = new LoaderResult(result, imageView,textView);
Message msg = handler.obtainMessage();
msg.what = 1;
msg.obj = loaderResult;
handler.sendMessage(msg);
}
} catch (Exception e) {
Log.e("this", "加载的时候出错了 " + e);
}
}
};
这里中的loaderResult方法就是获取并加载图片的,其中会调用到以下这方法根据imageview大小(即reqWidth和reqHeight参数)计算bitmap的采样率。
public int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight)
{
try {
int inSampleSize = 1;
int rawWidth = options.outWidth;
int rawHeight = options.outHeight;
while ((rawWidth / inSampleSize >= reqWidth) && (rawHeight / inSampleSize >= reqHeight))
{
inSampleSize = inSampleSize *2;
}
return inSampleSize;
}catch(Exception e)
{
Log.e("this","在calculate中,除数为0"+e);
return 1;
}
}
大概如上,ViewTreeObserver和view.post,我觉得不能保证加载图片的线程运行到计算采样率那里,高和宽一定能被算出来。至于view.measure,我本身imageview固定宽高都为100dp,但是这个方法,第一个参数int size,我传什么进去,getwidth,getheight就得到什么。
有大神指点指点吗