在onUpdate()方法中使用RemoteViewsFactory动态设置RemoteViews缓存和控件高度,并在onDataSetChanged()方法中更新缓存。具体的代码示例如下:
public class GlanceWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
Intent intent = new Intent(context, GlanceWidgetService.class);
views.setRemoteAdapter(R.id.listView, intent);
// Set the Empty view
views.setEmptyView(R.id.listView, R.id.empty_view);
// 设置RemoteViews高度
int height = getListViewHeight(context);
views.setListViewHeight(R.id.listView, height);
// 更新Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private int getListViewHeight(Context context) {
int rows = GlanceWidgetService.getRows();
TypedValue tv = new TypedValue();
int actionBarHeight = 0;
if (context.getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
context.getResources().getDisplayMetrics());
}
int height = rows * context.getResources().getDimensionPixelSize(R.dimen.widget_list_item_height)
+ actionBarHeight;
return height;
}
}
public class GlanceWidgetService extends RemoteViewsService {
public GlanceWidgetService() {
super();
}
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new GlanceWidgetRemoteViewsFactory(this.getApplicationContext(), intent);
}
public static int getRows() {
return rows;
}
}
public class GlanceWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private List mList = new ArrayList<>();
private Context mContext;
public GlanceWidgetRemoteViewsFactory(Context context, Intent intent) {
mContext = context.getApplicationContext();
}
@Override
public void onCreate() {
// 初始化缓存
initData();
}
@Override
public void onDataSetChanged() {
// 更新缓存
initData();
}
@Override
public void onDestroy() {
mList.clear();
}
@Override
public int getCount() {
return mList.size();
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews views = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item);
views.setTextViewText(R.id.text, mList.get(position));
return views;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
private void initData() {
mList.clear();
for (int i = 0; i < 20; i++) {
mList.add("Item " + i);
}
}
}