Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 毕加索:将图像加载到小部件列表视图_Android_Listview_Android Widget_Picasso - Fatal编程技术网

Android 毕加索:将图像加载到小部件列表视图

Android 毕加索:将图像加载到小部件列表视图,android,listview,android-widget,picasso,Android,Listview,Android Widget,Picasso,我正在基于本教程使用listview实现小部件:(源代码:) ListView项包含文本和图像,对于图像加载,我使用毕加索 getViewAt实现: public RemoteViews getViewAt(int position) { final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listview_item); ListItem listItem = list

我正在基于本教程使用listview实现小部件:(源代码:)

ListView项包含文本和图像,对于图像加载,我使用毕加索

getViewAt实现:

public RemoteViews getViewAt(int position) {
    final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listview_item);
    ListItem listItem = listItemList.get(position);
    remoteView.setTextViewText(R.id.headline, listItem.headline);
    final String imageUrl = listItem.image;
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (!Utils.isEmpty(imageUrl)) {
                picasso.load(imageUrl)
                        .placeholder(R.drawable.empty_photo)
                        .into(remoteView, R.id.picture, new int[] { appWidgetId });
            }
        }
    });

    return remoteView;
}
加载图像时,它会破坏布局

可能存在什么问题?或者我做错了什么

无图像加载:

加载图像后的外观:

更新:

如果我只添加几个嵌套的远程视图(所有视图都从一个布局中膨胀),也会发生同样的情况

更新2:


报告了一个问题:

在我自己努力解决这个问题之后,我决定阻止后台线程是可以的(使用毕加索的.get()),并且能够在我的适配器中实现以下功能:

    @Override
    public RemoteViews getViewAt(int position) {
        DBItem item = list.get(position);
        RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.widget_item);
        try {
            Bitmap b = Picasso.with(context).load(item.getImageUrl()).get();
            view.setImageViewBitmap(R.id.widget_image, b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        view.setTextViewText(R.id.widget_title, item.getTitle());
        return view;
    }
如果您知道返回图像的大小(如果它总是相同的,或者您可以预测它),您可能还希望执行类似的操作以减少调整大小的抖动:

    @Override
    public RemoteViews getLoadingView() {
        return new RemoteViews(context.getPackageName(), R.layout.v2_widget_item_loading);
    }

性能非常平稳,没有加载抖动,我对结果非常满意。

感谢square的优秀人员,现在已经添加了此支持

我就是这样用的

Picasso.with(mContext)
.load(imagePath)
.into(remoteViews, R.id.some_id, new int[] {mAppWidgetId});


享受黄油般平滑的滚动:)

您可以使用目标回调来处理这样的问题

 Picasso.with(mContext)
                        .load(imageUrl)
                        .placeholder(R.drawable.defimage)
                        .into(new Target() {
                            @Override
                            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                                mRemoteViews.setImageViewBitmap(R.id.myImage,bitmap);
                            }

                            @Override
                            public void onBitmapFailed(Drawable errorDrawable) {
                                //do something when loading failed 
                            }

                            @Override
                            public void onPrepareLoad(Drawable placeHolderDrawable) {
                               //do something while loading                                }
                        });

有关更多详细信息,请检查此

@ab。helly yes您的答案正确。不幸的是,这在listview中不起作用,因为毕加索需要调用主线程。在listview远程服务中,您的应用程序已在后台线程上。我也解决了这个问题,将缓存的位图存储在地图中,并以这种方式提供它们。我最初使用毕加索和调整大小来获得它们,以确保最佳性能。如何在远程视图工厂中获得mAppWidgetId,例如列表视图目标将很快被垃圾收集。毕加索对目标的引用很弱。只要你想让你的目标活下去,你就应该保持对它的引用。我应该说,在我的情况下,它的表现很糟糕。但是我+1这个答案,因为它只是需要一点改进。在调用.get()之前调用.fetch(),这样对同一图片的后续调用(当用户上下滚动时)将足够快。