0

なんらかの理由で、カスタム アダプターを使用すると、リスト ビューに常に 1 つの画像しか表示できません。なぜこれが起こっているのかわかりません。各リスト項目内に画像があるはずですが、最後のリスト項目にのみ画像が設定されているため、使用すべきではない場所で値を再利用していると思います。残りのリスト項目は適切に設定されています。

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);
        }
    }
}
4

1 に答える 1

0

ビューが表示されるたびに所有者が変わるという事実を忘れています。したがって、最後の項目のみに画像があるのは正常です。

AsyncTask は、getViewメソッドよりも完了するまでにかなり長い時間がかかります。

ImageView を AsyncTask に渡す必要があります。

new UrlLookup().execute(it.getUrl(), holder.img);

AsyncTask を呼び出すには

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);
    }
}

これで、すべての AsyncTask のすべての行の ImageView の参照が得られます。

Koush には、あなたがやりたいことだけを行う素晴らしいプロジェクトがあることを指摘したいと思います: UrlImageViewHelper

于 2013-02-04T21:55:18.623 に答える