Java ListView的自定义适配器(仅显示1个ImageView)

Java ListView的自定义适配器(仅显示1个ImageView),java,android,listview,Java,Android,Listview,由于某些原因,我的自定义适配器只允许我在任何时候都在列表视图中看到一个图像,我不知道为什么会发生这种情况。每个列表项中都应该有一个图像,但只有最后一个列表项有它的图像集,所以我假设我正在某个不应该在的地方重新使用一个值。列表中的其余项目正在正确设置 public class CustomAdapter extends ArrayAdapter<Item> { private ArrayList<Item> itemList; private ViewHo

由于某些原因,我的自定义适配器只允许我在任何时候都在列表视图中看到一个图像,我不知道为什么会发生这种情况。每个列表项中都应该有一个图像,但只有最后一个列表项有它的图像集,所以我假设我正在某个不应该在的地方重新使用一个值。列表中的其余项目正在正确设置

public class CustomAdapter extends ArrayAdapter<Item> {

    private ArrayList<Item> itemList;
    private ViewHolder holder; 
    private Context context;

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<Item> list) {
        super(context, textViewResourceId, list);
        this.itemList = new ArrayList<Item>();
        this.itemList.addAll(list);
        this.context = context;
    }

    private class ViewHolder {
        ImageView img;
        TextView name;
        CheckBox access;
    }

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

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.list_grid, null);

            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.access = (CheckBox) convertView.findViewById(R.id.checkBox1);
            holder.img = (ImageView) convertView.findViewById(R.id.imageView1);

            convertView.setTag(holder);
        } 

        else { holder = (ViewHolder) convertView.getTag(); }

        Item it = itemList.get(position);

        new UrlLookup().execute(it.getUrl());
        holder.name.setText(it.getName());
        holder.access.setChecked(it.isSelected());

        return convertView;
    }

    //Create an image from the url passed in from the server and display it on the image view   
    private class UrlLookup extends AsyncTask<String, Integer, String>{
        Bitmap bmp;

        @Override
        protected String doInBackground(String... params){  
            try {
                URL u = new URL(params[0]);
                bmp = BitmapFactory.decodeStream(u.openConnection().getInputStream());
            } catch (Exception e) { e.printStackTrace(); }

            return "Done!";
        }

        @Override
        protected void onPostExecute(String result){
            super.onPostExecute(result);    
            holder.img.setImageBitmap(bmp);
        }
    }
}
公共类CustomAdapter扩展了ArrayAdapter{
私有arraylistitemlist;
私人持票人;
私人语境;
公共CustomAdapter(上下文上下文、int textViewResourceId、ArrayList列表){
super(上下文、textViewResourceId、列表);
this.itemList=新的ArrayList();
this.itemList.addAll(列表);
this.context=上下文;
}
私有类视窗持有者{
图像视图img;
文本视图名称;
复选框访问;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
convertView=vi.充气(R.布局.列表\网格,空);
holder=新的ViewHolder();
holder.name=(TextView)convertView.findViewById(R.id.name);
holder.access=(复选框)convertView.findViewById(R.id.checkBox1);
holder.img=(ImageView)convertView.findViewById(R.id.imageView1);
convertView.setTag(支架);
} 
else{holder=(ViewHolder)convertView.getTag();}
Item it=itemList.get(位置);
新建urlookup().execute(it.getUrl());
holder.name.setText(it.getName());
holder.access.setChecked(it.isSelected());
返回视图;
}
//从服务器传入的url创建一个图像,并将其显示在图像视图中
私有类UrlLookup扩展了异步任务{
位图bmp;
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
URL u=新URL(参数[0]);
bmp=BitmapFactory.decodeStream(u.openConnection().getInputStream());
}catch(异常e){e.printStackTrace();}
返回“完成!”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
holder.img.setImageBitmap(bmp);
}
}
}

您忘记了这样一个事实:每次看到视图时,您的支架都会发生变化。所以只有最后一个项目有图像是正常的

AsyncTask将比
getView
方法花费更长的时间来完成

您应该将ImageView传递给AsyncTask:

new UrlLookup().execute(it.getUrl(), holder.img);
调用异步任务

private class UrlLookup extends AsyncTask<Object, Integer, String>{
    Bitmap bmp;
    ImageView view;

    @Override
    protected String doInBackground(Object... params){ 
        view = (ImageView) params[1]; 
        try {
            URL u = new URL((String)params[0]);
            bmp = BitmapFactory.decodeStream(u.openConnection().getInputStream());
        } catch (Exception e) { e.printStackTrace(); }

        return "Done!";
    }

    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);    
        view.setImageBitmap(bmp);
    }
}
私有类urlookup扩展了异步任务{
位图bmp;
图像视图;
@凌驾
受保护字符串doInBackground(对象…参数){
视图=(ImageView)参数[1];
试一试{
URL u=新URL((字符串)参数[0]);
bmp=BitmapFactory.decodeStream(u.openConnection().getInputStream());
}catch(异常e){e.printStackTrace();}
返回“完成!”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
view.setImageBitmap(bmp);
}
}
现在,您将拥有每个异步任务中每一行的ImageView的引用

我想向你们指出,Koush有一个出色的项目,可以做你们想做的事情:

这里有个提示。无需每次调用
getView
时都获取LayoutInflater。将
LayoutInflater
初始化移到构造函数中。@tolgap谢谢我这么做,但问题仍然存在。