关于Widget的介绍和用法可以看这两篇博文,写的非常详细了
Android 之窗口小部件详解--App Widget http://www.cnblogs.com/skywang12345/p/3158310.html
Android 之窗口小部件高级篇--App Widget 之 RemoteViews http://www.cnblogs.com/skywang12345/p/3264991.html
上面两篇博文没有提到怎么给Widget中的ListView或者GridView中显示网络图片,而我们的项目的需求中需要Widget中的ListView填充接口获得的文字和图片,试过很多方法最后发现还是以下这种伪同步比较让人满意。
private Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
private Bitmap mBitmap;
private Handler handler = new Handler(Looper.getMainLooper());
@Override
public RemoteViews getViewAt(final int position) {
//这里初始化RemoteView,设置监听,等等....
flags.put(position, false);
handler.post(new Runnable() {
@Override
public void run() {
//这里用了ImageLoader,或者别的带有加载回调加载库
ImageLoader.getInstance().loadImage(datas.get(position).getImgUrl, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
flags.put(position, true);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
flags.put(position, true);
}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
mBitmap = bitmap;
flags.put(position, true);
}
});
}
});
//在此一直等待获取到网络图片
while (!flags.get(position)) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flags.put(position, false);
if (mBitmap != null) {
mRemoteViews.setImageViewBitmap(R.id.widget_item_image, mBitmap);
} else {
mRemoteViews.setImageViewResource(R.id.widget_item_image, R.mipmap.ic_launcher);
}
mBitmap = null;
return mRemoteViews;
}