Android小部件带有ListView,仅显示加载视图

5
我正在尝试实现一个带有ListView的Android App小部件。 我开始跟随Google文档,但是我卡在了显示加载视图的列表上,而不是正常的列表项。 有人在小部件中使用列表视图有经验吗?
代码与Google文档中相同。 我使用ListView而不是StackView,并且数据源使用数据库(这不是问题,数据正确获取 - 我通过返回具有正确数据的普通列表项视图而不是默认加载视图来尝试了一下)
在互联网上搜索没有帮助我...我还尝试了这个教程,但也没有起作用。 我希望有人能帮助我,提前致谢!

代码

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        for (int i = 0; i < appWidgetIds.length; i++) {

            Intent intent = new Intent(context, EventWidgetService.class);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
            intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

            RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget);
            rv.setRemoteAdapter(android.R.id.list, intent);
            rv.setEmptyView(android.R.id.list, R.id.tvEmptyList);

            appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
        }

        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}

WidgetService.java

public class EventWidgetService extends RemoteViewsService {

    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {

         return new EventsWidgetListProvider(getApplicationContext(), intent);
    }
}

小部件列表提供程序
public class EventsWidgetListProvider implements RemoteViewsFactory {

    private List<> _entities = new ArrayList<>();
    private Context _context;
//  private int _appWidgetId;

    public EventsWidgetListProvider(Context context, Intent intent) {

        _context = context;
//      _appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }

    @Override
    public void onCreate() { }

    private void refreshEntities() {

        // Request data from database
        _entities = RequestResult;
    }

    @Override
    public RemoteViews getViewAt(int position) {

        final RemoteViews remoteViews = new RemoteViews(_context.getPackageName(), R.layout.list_row);

        // Set data to remoteViews [remoteViews.setTextViewText(), remoteViews.setImageViewResource()]

        return remoteViews;
    }

    @Override
    public int getCount() {

        return _entities.size();
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public void onDataSetChanged() {

        refreshEntities();
    }

    @Override
    public void onDestroy() { }

    @Override
    public RemoteViews getLoadingView() {

        return new RemoteViews(_context.getPackageName(), R.layout.widget_loading);
    }

    @Override
    public int getViewTypeCount() {

        return 0;
    }

    @Override
    public boolean hasStableIds() {

        return false;
    }
}

没有看到你的代码,我们无法真正提供帮助。 - ianhanniballake
就像我之前所说的那样,代码与Google文档中的几乎相同,但我已经更新了问题。如果您能给我一些建议,那将非常好。 - sschmid
2个回答

6

你的 getViewTypeCount 返回了 0。根据文档

如果适配器始终为所有项目返回相同类型的视图,则此方法应返回1。

通过返回 0,你告诉系统你没有任何要显示的视图类型。


0

如果你仍然无法解决问题:在我的情况下,我在列表项布局中使用了androidx类型的小部件,例如androidx.appcompat.widget.AppCompatTextView。将其更改为TextView即可解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接