【问题标题】:ListView in widget does not update小部件中的 ListView 不更新
【发布时间】:2013-12-20 12:57:39
【问题描述】:

我想从服务更新小部件中的 ListView。为此,我的服务中有此代码:

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);

我确定服务正在运行并且代码已执行,但在主屏幕上的小部件中没有任何反应。我的 ListProvider 如下所示:

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;
    }
}

这是我的 AppWidgetProvider:

public class MyWidgetProvider extends AppWidgetProvider
{
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}

但我认为 ListProvider 永远不会被调用。不显示日志消息,并且在主屏幕上没有任何反应。任何想法为什么?

【问题讨论】:

  • 如何将 Intent 从服务发送到您的小部件?
  • 我认为如果我将 ListView 更改为 RemoteView 并使用 updateAppWidget 调用小部件更新功能就足够了。这还不够吗?我不经常使用小部件。

标签: android android-listview android-widget


【解决方案1】:

使用服务更新远程适配器:

public class UpdateWidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return new ListProvider(this.getApplicationContext(), intent);
    }
}

并且直接使用服务类而不是RemoteViewFactory:

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);
}

从未在 listView 中测试过。

【讨论】:

  • 好的,它现在更新,但它总是显示no_data_imageview 并且在ListView 中没有项目。
  • 发布您的 AppWidgetProvider 课程
  • 我的 AppWidgetProvider 只调用 super.onUpdate(),因为我认为我通过 ID 获得了更改后的 RemoteView。我在上面编辑了我的问题。
  • 不,它不能只有 super.onUpdate ...您需要在我的答案中添加代码 {for (int i=0....} 在 onUpdate 后跟 super.onUpdate跨度>
  • laaptu.wordpress.com/2013/07/19/… 首先按照本教程进行操作,然后按照我的回答中所述更改 onUpdate 方法和 UpdateWidgetService
猜你喜欢
  • 2021-08-06
  • 2021-01-08
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2011-05-24
  • 2014-05-14
相关资源
最近更新 更多