Как использовать список в виджете?

Я пытаюсь создать список, загружаемый из RSS-каналов в виджет?

Кто-нибудь знает учебник о том, как использовать список в виджете?

Или, может быть, кто-то может предоставить 1.


person coder_For_Life22    schedule 06.09.2011    source источник


Ответы (2)


Я пытаюсь создать список, загружаемый из RSS-каналов в виджет?

Это возможно только на Honeycomb. Более ранние версии Android этого не поддерживали, и еще неизвестно, будет ли он поддерживаться на телефонах в будущем.

Кто-нибудь знает учебник о том, как использовать список в виджете?

Образец WeatherListWidget находится в вашем SDK и легко объясняется в документации.

person CommonsWare    schedule 06.09.2011
comment
Итак, что нужно сделать для работы с телефонами и планшетами? - person coder_For_Life22; 06.09.2011
comment
@coder_For_Life22: На это невозможно ответить абстрактно. Вообще говоря, вы не показываете вещи, похожие на списки в виджетах приложений, в качестве обходного пути. - person CommonsWare; 06.09.2011

По сути, вам нужно использовать два компонента:

  1. RemoteViewsFactory: это специальный адаптер.
  2. RemoteViewsService: возвращает первый.

Создадим класс 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>

И теперь в вашем классе Widget, который расширяет AppWidgetProvider, вы можете управлять макетами:

@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/

Теперь дни, это не так уж и редко. Надеюсь помочь кому-нибудь.

person Slashhh    schedule 24.04.2018
comment
@Slashhh Пожалуйста, включите соответствующую информацию в сам ответ, потому что, если завтра эта ссылка изменится / будет удалена, это сделает этот ответ недействительным, поэтому ответы только по ссылке не допускаются. - person Alon Eitan; 24.04.2018
comment
@alon-eitan, хорошо, готово!! - person Slashhh; 24.04.2018