在的ListView控件不更新 [英] ListView in widget does not update
问题描述
我想更新从服务窗口小部件一个ListView。为此,我有这个code在我的服务:
意向意图=新意图(CTX,ListProvider.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,为widgetid);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));remoteViews.setRemoteAdapter(为widgetid,R.id.listViewWidget,意向);
appWidgetManager.updateAppWidget(为widgetid,remoteViews);
我敢肯定,服务正在运行并执行code,但在主屏幕上什么也没有发生小部件。我ListProvider看起来是这样的:
公共类ListProvider实现RemoteViewsFactory
{
公共ListProvider(上下文的背景下,意图意图)
{
Log.d(ME,新ListProvider); this.context =背景;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID); populateListItem();
} 私人无效populateListItem()
{
的for(int i = 0;我小于10;我++)
{
列表项的listItem =新的ListItem();
listItem.heading =标题+我;
listItem.content = I +,这是内容;
listItemList.add(的listItem);
}
} @覆盖
公众诠释getCount将()
{
返回listItemList.size();
} @覆盖
众长getItemId(INT位置)
{
返回的位置;
} @覆盖
公共RemoteViews getViewAt(INT位置)
{
最后RemoteViews远程视窗=新的RemoteViews(context.getPackageName(),R.layout.list_row);
列表项的listItem = listItemList.get(位置); remoteView.setTextViewText(R.id.heading,listItem.heading);
remoteView.setTextViewText(R.id.content,listItem.content); 返回远程视窗;
} @覆盖
公共RemoteViews getLoadingView()
{
返回null;
} @覆盖
公众诠释getViewTypeCount()
{
返回1;
} @覆盖
公共布尔hasStableIds()
{
返回true;
} //其他一些重写方法 公共类的ListItem
{
公共字符串的标题,内容;
}
}
这是我的AppWidgetProvider:
公共类MyWidgetProvider扩展AppWidgetProvider
{
@覆盖
公共无效的onUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds)
{
super.onUpdate(背景下,appWidgetManager,appWidgetIds);
}
}
但ListProvider永远不会被调用,我认为。不显示和主屏幕上什么也没有发生的日志信息。任何想法,为什么?
公共类UpdateWidgetService扩展RemoteViewsService {
@覆盖
公共RemoteViewsFactory onGetViewFactory(意向意图){
返回新ListProvider(this.getApplicationContext(),意向);
}
}
使用服务更新远程适配器:和使用服务类,而不是直接的RemoteViewFactory的
的for(int i = 0; I< appWidgetIds.length ++ I){RemoteViews remoteViews =新的RemoteViews(context.getPackageName(),R.layout.widget_layout); 意图serviceIntent =新意图(背景下,UpdateWidgetService.class);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetIds [I]);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(appWidgetIds [I],R.id.stackWidgetView,serviceIntent);
remoteViews.setEmptyView(R.id.stackWidgetView,R.id.no_data_imageview);
appWidgetManager.updateAppWidget(appWidgetIds [I],remoteViews); }
的给这个code一试的....
从来没有测试它的ListView
I want to update a ListView in a widget from a service. For this I have this code in my service:
Intent intent = new Intent(ctx, ListProvider.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(widgetId, R.id.listViewWidget, intent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
I'm sure that the service is running and the code is executed but in the widget on the homescreen nothing happens. My ListProvider looks like this:
public class ListProvider implements RemoteViewsFactory
{
public ListProvider(Context context, Intent intent)
{
Log.d("ME", "new ListProvider");
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
populateListItem();
}
private void populateListItem()
{
for (int i = 0; i < 10; i++)
{
ListItem listItem = new ListItem();
listItem.heading = "Heading" + i;
listItem.content = i + " This is the content";
listItemList.add(listItem);
}
}
@Override
public int getCount()
{
return listItemList.size();
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public RemoteViews getViewAt(int position)
{
final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.list_row);
ListItem listItem = listItemList.get(position);
remoteView.setTextViewText(R.id.heading, listItem.heading);
remoteView.setTextViewText(R.id.content, listItem.content);
return remoteView;
}
@Override
public RemoteViews getLoadingView()
{
return null;
}
@Override
public int getViewTypeCount()
{
return 1;
}
@Override
public boolean hasStableIds()
{
return true;
}
// Some other override methods
public class ListItem
{
public String heading,content;
}
}
And this is my AppWidgetProvider:
public class MyWidgetProvider extends AppWidgetProvider
{
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
But the ListProvider is never called I think. The Log message is not displayed and on the homescreen nothing happens. Any ideas why?
public class UpdateWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new ListProvider(this.getApplicationContext(), intent);
}
}
Use a service to Update the remote Adapter: And use the service class instead of the RemoteViewFactory directly.
for (int i = 0; i < appWidgetIds.length; ++i) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent serviceIntent = new Intent(context, UpdateWidgetService.class);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(appWidgetIds[i], R.id.stackWidgetView, serviceIntent);
remoteViews.setEmptyView(R.id.stackWidgetView, R.id.no_data_imageview);
appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); }
Give this code a try.... Never tested it on listview
这篇关于在的ListView控件不更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!