带有ListView的Android Widget仅显示加载视图

时间:2014-09-28 20:19:20

标签: android android-listview android-appwidget remoteview

我正在尝试使用ListView实现 Android App小部件。我开始关注Google文档,但我遇到了正在显示的加载视图列表,而不是正常的列表项。有没有人有小部件列表视图的经验?

代码与Google docs中的代码相同。我使用ListView而不是StackView作为数据源我使用数据库(这不是问题,数据是正确获得的 - 我已经尝试通过返回正常的列表项视图来使用正确的数据而不是默认的加载视图)< / p>

搜索互联网对我没有帮助......我也尝试了这个tutorial,但它也没有用。 我希望任何人都可以帮助我,提前谢谢!

代码

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);
    }
}

WidgetListProvider

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;
    }
}

2 个答案:

答案 0 :(得分:5)

您的getViewTypeCount返回0。根据{{​​3}}:

  

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

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

答案 1 :(得分:0)

就算您仍然不能解决问题:就我而言,我在清单视图项目布局中使用的是androidx类型的小部件,例如androidx.appcompat.widget.AppCompatTextView。更改为TextView并解决了该问题。