【问题标题】:Android - Widget with Scrollable Listview Manual RefreshAndroid - 带有可滚动列表视图的小部件手动刷新
【发布时间】:2012-10-13 05:29:04
【问题描述】:

我用谷歌搜索并找到了使用 RemoteViewsService 和 RemoteViewsService.RemoteViewsFactory. 操作列表视图数据的代码,如下所示

Intent svcIntent = new Intent(context, WidgetService.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetIds[i]);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews widget = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
widget.setRemoteAdapter(appWidgetIds[i], R.id.lstAppointments,svcIntent);

WidgetService.java 包含

public class WidgetService extends RemoteViewsService {

    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return (new WidgetViewsFactory(this.getApplicationContext(), intent));
    }

    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return super.onBind(intent);
    }
}

并在WidgetViewsFactory实现RemoteViewsService.RemoteViewsFactory的onCreate中编写了所有从webservice获取数据的代码

对于每 5 秒手动或自动更新记录,我发现 Update via Service 方法如下所述

public class WordWidget extends AppWidgetProvider {

    static int value = 1;
    Handler handler = new Handler();
    MyRunnable myRunnable;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // To prevent any ANR timeouts, we perform the update in a service
        myRunnable = new MyRunnable(context);
        handler.postDelayed(myRunnable, 1000);
    }

    class MyRunnable implements Runnable {

        Context context;

        public MyRunnable(Context context) {
            this.context = context;
        }

        public void run() {
            context.startService(new Intent(context, UpdateService.class));
            handler.postDelayed(myRunnable, 1000);
        }
    }

    public static class UpdateService extends Service {
        @Override
        public void onStart(Intent intent, int startId) {
            // Build the widget update for today
            RemoteViews updateViews = buildUpdate(this);

            // Push update for this widget to the home screen
            ComponentName thisWidget = new ComponentName(this, WordWidget.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            manager.updateAppWidget(thisWidget, updateViews);
        }

        public RemoteViews buildUpdate(Context context) {
            RemoteViews updateViews;

            // Build an update that holds the updated widget contents
            updateViews = new RemoteViews(context.getPackageName(),
                    R.layout.widget_word);

            Log.e("value", String.valueOf(value));
            updateViews.setTextViewText(R.id.word_title, "Title");
            updateViews.setTextViewText(R.id.word_type, String.valueOf(value));
            updateViews.setTextViewText(R.id.definition, String.valueOf(value));

            value += 1;

            // When user clicks on widget it opens www.google.com
            Intent defineIntent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("https://www.google.co.in/"));
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                    defineIntent, 0);
            updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent);

            return updateViews;
        }

        @Override
        public IBinder onBind(Intent intent) {
            // We don't need to bind to this service
            return null;
        }
    }
}

如何自动更新列表视图..我知道如何更新上面提到的文本视图。

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    您可以使用AppWidgetManager 的notifyAppWidgetViewDataChanged() 方法更新ListView。您将必须获取 AppWidgetManager 的实例,获取 AppWidgetIds 和调用 appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

    伪代码,

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int appWidgetIds[] = appWidgetManager.getAppWidgetIds(
                               new ComponentName(context, WidgetProvider.class));
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listview);
    

    当您调用notifyAppWidgetViewDataChanged() 时,将调用RemoteViewsFactory 的onDataSetChanged() 方法,该方法用作您的ListView 的适配器。您可以在onDataSetChanged() 中执行 Web 服务和其他操作,获取响应并将其添加到您的数据集中,可能是 ArrayList 或任何此类集合。

    如需进一步阅读/参考,您可以查看文档中的Keeping Collection Data Fresh 部分。您也可以查看我的github 的演示示例。

    【讨论】:

    • 在查看了该站点中的许多线程后,没有一个对我有用(可能是因为我使用的是“收藏小部件”),这个很有魅力!非常感谢!
    • 我使用的是 sendBroadcast() ,它反过来重新创建每个布局,而不是更新列表视图。方法 notifyAppWidgetViewDataChanged 只负责刷新,从而降低成本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多