Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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 Glide图像没有显示在第一个屏幕上_Android_Android Glide - Fatal编程技术网

Android Glide图像没有显示在第一个屏幕上

Android Glide图像没有显示在第一个屏幕上,android,android-glide,Android,Android Glide,我正在使用Android glide加载远程图像,但在这里我遇到了一个奇怪的问题,第一个屏幕上的图像没有显示,但当我向下滚动并再次向上滚动时,这些图像会正常显示。以下是屏幕截图: 我也在谷歌上搜索了这样的问题并找到了一个答案,在尝试了这些步骤之后,它仍然不起作用,您可能需要检查代码,如下所示: public class SiteAdapter extends ArrayAdapter<Site> { private int resourceId; private List<Si

我正在使用Android glide加载远程图像,但在这里我遇到了一个奇怪的问题,第一个屏幕上的图像没有显示,但当我向下滚动并再次向上滚动时,这些图像会正常显示。以下是屏幕截图: 我也在谷歌上搜索了这样的问题并找到了一个答案,在尝试了这些步骤之后,它仍然不起作用,您可能需要检查代码,如下所示:

public class SiteAdapter extends ArrayAdapter<Site> {
private int resourceId;
private List<Site> sites = null;
private Context context;
private SiteHolder siteHolder;
/**
 * @param context the current activity context, we can get it using the super ArrayAdapter constructor
 * @param resource the site_layout.xml file
 * @param objects the collection to store all the sites
 */
public SiteAdapter(Context context, int resource, List<Site> objects) {
    super(context, resource, objects);
    this.context = context;
    this.resourceId = resource;
    this.sites = objects;
}

@Override
public Site getItem(int position) {
    return sites.get(position);
}

@Override
public int getCount() {
    return sites.size();
}

//get the viewpage which inflate by site_layout.xml file
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Site site = getItem(position);
    View view = convertView;
    siteHolder = new SiteHolder();
    if (view == null) {
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = vi.inflate(resourceId, null);
    }
    //this place we need to get the whole widget in site_layout.xml file
    siteHolder.image = (ImageView) view.findViewById(R.id.thumbnail);
    siteHolder.address = (TextView)view.findViewById(R.id.address);
    siteHolder.mallName = (TextView) view.findViewById(R.id.name);
    siteHolder.distance = (TextView) view.findViewById(R.id.distance);
    siteHolder.address.setText(site.getAddress());
    //set name of the view
    siteHolder.mallName.setText(site.getName());
    //set price of the view
    //set distance of the view
    siteHolder.distance.setText("<" + site.getDistance() + "m");
    //set image
    ImageTask task = new ImageTask();
    task.execute("http://xxxx/springmvc/getFirst/" + site.getName());
    return view;
}

//检测adapater中加载网络资源是否可行?结论:不可行
public String getImgUrl(String str){
    String data = "";
    try {
        URL u = new URL(str);
        HttpURLConnection conn = (HttpURLConnection) u.openConnection();
        InputStream is = conn.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String content = "";
        StringBuffer sb = new StringBuffer();
        while((content = br.readLine()) != null){
            sb.append(content);
        }
        data = sb.toString();
        br.close();
        is.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}
class ImageTask extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... str) {
        String data = "";
        data = getImgUrl(str[0]);
        return data;
    }

    @Override
    protected void onPostExecute(String s) {
        Glide.with(context)
            .load(s)
            .fitCenter()
            .into(siteHolder.image);
    }
}

class SiteHolder{
    ImageView image;
    TextView mallName;
    TextView address;
    TextView distance;
    }
}
公共类SiteAdapter扩展了ArrayAdapter{
私有资源ID;
私有列表站点=null;
私人语境;
私人网站持有人网站持有人;
/**
*@param context当前活动上下文,我们可以使用super ArrayAdapter构造函数获取它
*@param resource站点_layout.xml文件
*@param对象集合以存储所有站点
*/
公共SiteAdapter(上下文、int资源、列表对象){
超级(上下文、资源、对象);
this.context=上下文;
this.resourceId=资源;
这是一个网站=对象;
}
@凌驾
公共站点getItem(内部位置){
返回站点。获取(位置);
}
@凌驾
public int getCount(){
返回sites.size();
}
//获取按site_layout.xml文件膨胀的viewpage
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
站点站点=获取项目(位置);
视图=转换视图;
siteHolder=新的siteHolder();
如果(视图==null){
LayoutInflater vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
视图=vi.inflate(resourceId,null);
}
//在这里,我们需要在site_layout.xml文件中获取整个小部件
siteHolder.image=(ImageView)view.findViewById(R.id.缩略图);
siteHolder.address=(TextView)view.findViewById(R.id.address);
siteHolder.mallName=(TextView)view.findViewById(R.id.name);
siteHolder.distance=(TextView)view.findViewById(R.id.distance);
siteHolder.address.setText(site.getAddress());
//设置视图的名称
siteHolder.mallName.setText(site.getName());
//设置视图的价格
//设置视图的距离
siteHolder.distance.setText(“参见

圆形图片
圆形图像视图
/
圆形图像视图
/
圆形图像视图
已知具有可转换的
.crossFade()
带有
的缩略图()
占位符()
)和动画GIF,使用(
.circleCrop()
将在v4中提供)或
.dontAnimate()
来修复此问题

简言之:取整视图总是将传入的可绘制内容栅格化为位图,如果可绘制内容(GIF或crossFade)中有动画,这将不起作用

在第一次加载时,在检索图像时显示占位符,然后交叉淡入图像;之后,当您向上滚动时,图像会立即从内存缓存中加载,因此不会出现动画。

在响应时,我发现了图像未加载的潜在根本原因:在
getView
中,您覆盖了
站点持有者
,因此无论哪个
ImageTask
完成,它都会更新最后一个绑定行,而不是启动任务的原始行。有关如何在这样的双重分派情况下改进Glide相关代码的更多提示,请参阅GitHub上的问题。快速修复:

public class SiteAdapter extends ArrayAdapter<Site> {
    //private SiteHolder siteHolder; // remove this field

public View getView(int position, View convertView, ViewGroup parent) {
    SiteHolder siteHolder = new SiteHolder();
    ...
    ImageTask task = new ImageTask(siteHolder);
    ...
}

static class ImageTask extends AsyncTask<String, Void, String> {
    private SiteHolder siteHolder; // TODO initialize in constructor
    // rest stays the same, but notice the `static` modifier above!
}
公共类SiteAdapter扩展了ArrayAdapter{
//private SiteHolder SiteHolder;//删除此字段
公共视图getView(int位置、视图转换视图、视图组父视图){
SiteHolder SiteHolder=新的SiteHolder();
...
ImageTask任务=新的ImageTask(站点持有者);
...
}
静态类ImageTask扩展了AsyncTask{
私有SiteHolder SiteHolder;//TODO在构造函数中初始化
//rest保持不变,但请注意上面的'static'修饰符!
}

为什么不直接使用glide下载和显示图像?您可以使用
simpletarget
在glide中下载和显示图像,这也可能有助于列表图像的同步更新。在postexecute中设置图像后,最后调用
notifydatasetchanged
method@MohammedAtif我以前试过你的方法d错误仍然发生,
simpletarget
只是一个imageview回调,无法解决此问题。至于
notifydatasetchenged
方法,实际上我之前发布过此问题,尝试使用此方法也失败了。可能是滑动缓存问题,第一次滑动在缓存中下载图像数据,重新滚动后,滑动pu如果是这样,你能给我更多的建议吗?这肯定是notifydatasetchanged问题。你必须在正确的时间调用它。你可以添加glide侦听器,并在on resource ready方法中调用notifydatasetchanged@MohammedAtif我有点困惑,你的意思是我用simpletarget下载数据,但你知道实际的image url是
doInBackground
返回值,我如何在simpleadapter中使用该值。你能在下面做一个演示吗?我相信你的答案可能是我想要的,但我不知道如何修改我的代码。我相信你每次都在下载图像,所以使用后台线程或使用自定义下载管理器没有意义,请参阅我的answ呃,下面,我已经在你现有的方法中完全添加了代码。这对你来说应该不是问题。我使用listener而不是Simple Target的原因是你可以同时侦听错误和成功。感谢你回答TWiStErRob,我已经看到了关于兼容性部分的文章。添加了另外三个外部集成库ry直接制作的应用程序崩溃了,另外,我还有一些好奇。首先,圆形图片?你指定了一些视图,但我只使用imageview,不使用任何动画,所以dontAnimate也不起作用。啊,这是真的。你的占位符(或其他红色的东西)是圆形的,这误导了我,但刚刚注意到最后一个是矩形图像。您正在使用动画,因为
crossFade()
是def