Android RemoteViews ListView Scroll

4 android

我试图滚动ListView到一个特定的位置AppWidget.

但它没有做任何事情,我也尝试了setPosition方法,但没有工作.

也没有错误或堆栈跟踪.

码:

                    if (list.size() == 0) {
                        loadLayout(R.layout.rooster_widget_header);
                        views.addView(R.id.header_container,
                                views);
                    } else {
                        views.setRemoteAdapter(R.id.lvWidget, svcIntent);
                        views.setScrollPosition(R.id.lvWidget, 3);
                    }
Run Code Online (Sandbox Code Playgroud)

Man*_*ani 5

问题:ListView在显示之前没有任何孩子.因此,setScrollPosition在设置adpater后立即调用无效.以下是AbsListView中的代码,它执行此检查:

final int childCount = getChildCount();
if (childCount == 0) {
    // Can't scroll without children.
    return;
}
Run Code Online (Sandbox Code Playgroud)

解决方案:理想情况下,我会用于ViewTreeObserver.OnGlobalLayoutListener设置ListView滚动位置,但在远程视图的情况下是不可能的.设置滚动位置并partiallyUpdateAppWidget在运行中调用一些延迟.我修改了Android天气小部件代码并在git hub中共享.

public class MyWidgetProvider extends AppWidgetProvider {

    private static HandlerThread sWorkerThread;
    private static Handler sWorkerQueue;

    public MyWidgetProvider() {
        // Start the worker thread
        sWorkerThread = new HandlerThread("MyWidgetProvider-worker");
        sWorkerThread.start();
        sWorkerQueue = new Handler(sWorkerThread.getLooper());
    }

    public void onUpdate(Context context, final AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int i = 0; i < appWidgetIds.length; ++i) {
            ...
            final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            views.setRemoteAdapter(R.id.lvWidget, svcIntent);

            sWorkerQueue.postDelayed(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    views.setScrollPosition(R.id.list, 3);
                    appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], views);
                }

            }, 1000);

            appWidgetManager.updateAppWidget(appWidgetIds[i], views);
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是屏幕记录.它滚动到第5位.

在app小部件中自动滚动ListView