在的ListView控件不更新 [英] ListView in widget does not update

查看:107
本文介绍了在的ListView控件不更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想更新从服务窗口小部件一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆