android API 11 RemoteViews 提供出一些新的方法,让我们可以在桌面widget上添加一些复杂界面元素。

比较有代表性的是 ListView。就此写贴做个记录与分享。

 

源码

http://download.csdn.net/detail/yarkey09/6513753

 

效果图

android AppWidget 支持ListView_第1张图片

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                                        

请注意加入权限:android:permission="android.permission.BIND_REMOTEVIEWS

否则我们定义的Service不会onBind,待会Factory的代码就不会被调用。

 

AppWidgetProvider.java

package com.yarkey.remoteviewstest;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.util.Log;import android.widget.RemoteViews;public class MyWidget extends AppWidgetProvider {private static final String TAG = "MyWidget";/** package */static ComponentName getComponentName(Context context) {return new ComponentName(context, MyWidget.class);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {Log.d(TAG, "onUpdate");performUpdate(context, appWidgetManager, appWidgetIds, null);}private void performUpdate(Context context, AppWidgetManager awm, int[] appWidgetIds, long[] changedEvents) {for (int appWidgetId : appWidgetIds) {Log.d(TAG, "appWidgetId = " + appWidgetId);Intent intent = new Intent(context, MyWidgetService.class);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout_widget);views.setTextViewText(R.id.button1, "已更新");views.setRemoteAdapter(R.id.listView1, intent);awm.updateAppWidget(appWidgetId, views);awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.listView1);}}}

关键就是:views.setRemoteAdapter( int viewId, Intent intent )

这个方法在API 14才有。API 11相同方法 setRemoteAdapter( int appWidgetId, int viewId, Intent intent )

 

RemoteViewsService.java

package com.yarkey.remoteviewstest;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.RemoteViews;import android.widget.RemoteViewsService;public class MyWidgetService extends RemoteViewsService {private static final boolean DB = true;private static final String TAG = "MyWidgetService";@Overridepublic RemoteViewsFactory onGetViewFactory(Intent intent) {log("onGetViewFactory, intent=" + intent);return new MyWidgetFactory(getApplicationContext(), intent);}public static class MyWidgetFactory implements RemoteViewsService.RemoteViewsFactory {private Context mContext;private String[] mFoods = new String[] { "Apple", "Banana", "Pear", "Handset", "People", "Bar", "Wind", "Song","Source code", "Screen", "Package", "Cup", "Computer" };// 构造public MyWidgetFactory(Context context, Intent intent) {log("MyWidgetFactory");mContext = context;}@Overridepublic int getCount() {log("getCount");return mFoods.length;}@Overridepublic long getItemId(int position) {log("getItemId");return position;}// 在调用getViewAt的过程中,显示一个LoadingView。// 如果return null,那么将会有一个默认的loadingView@Overridepublic RemoteViews getLoadingView() {log("getLoadingView");return null;}@Overridepublic RemoteViews getViewAt(int position) {log("getViewAt, position=" + position);if (position < 0 || position >= getCount()) {return null;}RemoteViews views = new RemoteViews(mContext.getPackageName(), R.layout.layout_item);views.setTextViewText(R.id.textView1, mFoods[position]);return views;}@Overridepublic int getViewTypeCount() {log("getViewTypeCount");return 1;}@Overridepublic boolean hasStableIds() {log("hasStableIds");return true;}@Overridepublic void onCreate() {log("onCreate");}@Overridepublic void onDataSetChanged() {log("onDataSetChanged");}@Overridepublic void onDestroy() {log("onDestroy");}}private static void log(String log) {if (DB)Log.d(TAG, log);}}

有点类似BaseAdapter, getCount(), getViewAt()

 

-- end --

更多相关文章

  1. Listview 选项按下去黑了所有按钮的解决方法 ——android:cacheC
  2. Ashmem(Android共享内存)使用方法和原理
  3. 【Android】添加菜单和监听菜单方法详解
  4. Android录音时获取分贝值的方法代码实例
  5. 升级Android SDK Tools以及Android SDK Platform-tools目录被占
  6. 【Android-tips】 Unable to execute dex: Multiple dex files d

随机推荐

  1. 方式性能函数定义与用法汇总
  2. XML交互入门教程
  3. XmlTextWriter函数定义与用法汇总
  4. DTD详解的内容推荐
  5. 有关XMLSerializer的文章推荐8篇
  6. 有关真可的文章推荐10篇
  7. 关于-----------XML的10篇文章推荐
  8. 有关文档大小的文章推荐8篇
  9. 增、删、改的实例汇总
  10. 关于XSLT讲解的10篇文章推荐