如何在窗口小部件中使用listview?

时间:2011-09-06 00:12:43

标签: android listview widget

我正在尝试创建一个从rss feed加载到widget中的listview?

有没有人知道如何在wigdet中使用listview的教程?

也许有人可以提供1.

2 个答案:

答案 0 :(得分:1)

  

我正在尝试创建一个从rss feed加载到widget中的listview?

这只适用于Honeycomb。早期版本的Android不支持这一点,未来的手机是否会支持它还有待观察。

  

有没有人知道如何在wigdet中使用listview的教程?

WeatherListWidget示例位于SDK中,并对in the documentation进行了轻微解释。

答案 1 :(得分:-1)

基本上,您需要使用两个组件:

  1. RemoteViewsFactory :这是特殊适配器。
  2. RemoteViewsService :这是为了返回第一个。
  3. 让我们创建RemoteViewsFactory类:

    public class MyWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
    
        private Context mContext;
        private Cursor mCursor;
    
        public MyWidgetRemoteViewsFactory(Context applicationContext, Intent intent) {
            mContext = applicationContext;
        }
    
        @Override
        public void onCreate() {
    
        }
    
        @Override
        public void onDataSetChanged() {
    
            if (mCursor != null) {
                mCursor.close();
            }
    
            final long identityToken = Binder.clearCallingIdentity();
            Uri uri = Contract.PATH_TODOS_URI;
            mCursor = mContext.getContentResolver().query(uri,
                    null,
                    null,
                    null,
                    Contract._ID + " DESC");
    
            Binder.restoreCallingIdentity(identityToken);
    
        }
    
        @Override
        public void onDestroy() {
            if (mCursor != null) {
                mCursor.close();
            }
        }
    
        @Override
        public int getCount() {
            return mCursor == null ? 0 : mCursor.getCount();
        }
    
        @Override
        public RemoteViews getViewAt(int position) {
            if (position == AdapterView.INVALID_POSITION ||
                    mCursor == null || !mCursor.moveToPosition(position)) {
                return null;
            }
    
            RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.collection_widget_list_item);
            rv.setTextViewText(R.id.widgetItemTaskNameLabel, mCursor.getString(1));
    
            return rv;
        }
    
        @Override
        public RemoteViews getLoadingView() {
            return null;
        }
    
        @Override
        public int getViewTypeCount() {
            return 1;
        }
    
        @Override
        public long getItemId(int position) {
            return mCursor.moveToPosition(position) ? mCursor.getLong(0) : position;
        }
    
        @Override
        public boolean hasStableIds() {
            return true;
        }
    
    }
    

    现在是RemoteViewsService(简单的)的时候了:

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

    此外,您必须在androidManifest.xml中注册此服务:

    <service android:name=".AppWidget.MyWidgetRemoteViewsService"
        android:permission="android.permission.BIND_REMOTEVIEWS"></service>
    

    现在在扩展AppWidgetProvider的Widget类中,您可以管理布局:

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            RemoteViews views = new RemoteViews(
                    context.getPackageName(),
                    R.layout.collection_widget
            );
            Intent intent = new Intent(context, MyWidgetRemoteViewsService.class);
            views.setRemoteAdapter(R.id.widgetListView, intent);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
    

    现在在 res / xml 中创建一个新资源文件,并将其命名为collection_widget.xml:

    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:minWidth="40dp"
        android:minHeight="40dp"
        android:updatePeriodMillis="864000"
        android:previewImage="@drawable/simple_widget_preview"
        android:initialLayout="@layout/collection_widget"
        android:resizeMode="horizontal|vertical"
        android:widgetCategory="home_screen">
    </appwidget-provider>
    

    我们需要在 res / layout 中再创建两个文件来定义列表的布局和每个列表项的布局。

    <强> collection_widget.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorWhite"
            xmlns:tools="http://schemas.android.com/tools"
            android:orientation="vertical">
        <FrameLayout android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView android:layout_width="match_parent"
                android:id="@+id/widgetTitleLabel"
                android:text="@string/title_collection_widget"
                android:textColor="@color/colorWhite"
                android:background="@color/colorPrimary"
                android:textSize="18dp"
                android:gravity="center"
                android:textAllCaps="true"
                android:layout_height="@dimen/widget_title_min_height"></TextView>
        </FrameLayout>
        <LinearLayout android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ListView android:id="@+id/widgetListView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorWhite"
                android:dividerHeight="1dp"
                android:divider="#eeeeee"
                tools:listitem="@layout/collection_widget_list_item"></ListView>
        </LinearLayout>
    </LinearLayout>
    

    <强> collection_widget_list_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:paddingLeft="@dimen/widget_listview_padding_x"
        android:paddingRight="@dimen/widget_listview_padding_x"
        android:paddingStart="@dimen/widget_listview_padding_x"
        android:paddingEnd="@dimen/widget_listview_padding_x"
        android:minHeight="@dimen/widget_listview_item_height"
        android:weightSum="2"
        android:id="@+id/widgetItemContainer"
        android:layout_height="wrap_content">
    
        <TextView android:id="@+id/widgetItemTaskNameLabel"
            android:layout_width="wrap_content"
            android:gravity="start"
            android:layout_weight="1"
            android:textColor="@color/text"
            android:layout_gravity="center_vertical"
            android:layout_height="wrap_content"></TextView>
    
    </LinearLayout>
    

    我使用这篇文章就像一个例子,对我来说就像一个魅力!!

    https://www.sitepoint.com/killer-way-to-show-a-list-of-items-in-android-collection-widget/

    现在有一天,这并不罕见。希望能帮助别人。