2

我正在尝试在具有 ArrayAdapter 的 ListView 中添加图像。仅供参考,toList() 是从迭代器到给定 DBObject 列表的转换。

我覆盖View getView()并设置了一个文本视图和一个图像。

private static class EventAdapter extends ArrayAdapter<DBObject> {      

    public EventAdapter(Context context, int resource, Iterable<DBObject> events) {
        super(context, resource, toList(events));           
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;               
        LayoutInflater vi = LayoutInflater.from(getContext());                              
        v = vi.inflate(R.layout.adapter_event_list, null);

        DBObject event = getItem(position);

        if (event != null) {

            //Get the logo if any
            if( ((DBObject)event.get("events")).containsField("logo") ){      

                String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
                ImageView eventLogo = (ImageView) v.findViewById(R.id.eventLogoList);
                new setLogo().execute(logoURL, eventLogo);

            }               
            TextView title= (TextView) v.findViewById(R.id.eventTitleList);             
            title.setText( ((DBObject)event.get("events")).get("title").toString() );               

        }

        return v;
    }

    protected static <T> List<T> toList( Iterable<T> objects ) {
        final ArrayList<T> list = new ArrayList<T>();
        for( T t : objects ) list.add(t);
        return list;
    }
    //setLogo() method here. See below
 }

文本视图中的文本很好。然而,图像变得一团糟。它们似乎加载到列表中的错误位置。代码的路线是:1)从数据库获取(异步)2)填充ListView 3)同时填充加载每个图像(第二个异步)。

这是上面的setLogo()AsyncTask EventAdapter

private class setLogo extends AsyncTask<Object,Void,Bitmap>{

        ImageView eventLogo = null;

        @Override
        protected Bitmap doInBackground(Object...params) {
            try{
                Bitmap eventImage = downloadBitmap((String) params[0]);
                eventLogo =  (ImageView) params[1];
                return eventImage;
            }
            catch(Exception e){
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap eventImage) {
            if(eventImage!=null && eventLogo!=null){                    
                eventLogo.setImageBitmap(eventImage);
            }
        }  

}

我这样做了(使用异步),我相信这是从 url 加载图像的正确方法。我在多线程上看到了这篇文章,并从中借用了该downloadBitmap()方法。

如上所述,图像加载到 ListView 的错误位置。什么是加载它们的可靠方法?

此外,传递v.findViewById(R.id.eventLogoList)AsyncTask 内部的想法是程序将区分每个适配器的 ImageView,但似乎没有。


更新

在关注导致这种混合的问题之后,我发现了这个 SO question

我更改了我的代码以检查是否if导致问题。

//Get the logo if any               
if( ((DBObject)event.get("events")).containsField("logo") ){                        
        String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
        ImageView eventLogo = (ImageView) row.findViewById(R.id.eventLogoList);

        //new setLogo().execute(logoURL, eventLogo);   

        TextView title= (TextView) row.findViewById(R.id.eventTitleList);
        title.setText( "Shit happens" );    

    }

假设我有 40 件商品。Shit happens设置在字段存在的字段上logo。如果我向下/向上滚动,顺序会发生变化,并且文本会变得混乱。这是因为在循环内创建的堆栈小于列表的最大值..我想......我还在挣扎。

PS:我发现这个简单的库可以异步加载图像而不是 DYI 的东西。


更新 2

我添加了一个带有静态网址的 else 。由于加载图像所需的时间,它们仍然放错了位置。

4

1 回答 1

0

我真的会去像毕加索这样的好图书馆。它将为您处理所有困难的部分,并且写得很好。 http://square.github.io/picasso/

于 2014-01-22T17:23:21.990 回答