0

画像付きのカスタムリストビューがあります。URLを介して画像のソースを設定する必要がありますが、プロセスがUIをブロックしたくないので、非同期タスクを使用しています。ただし、画像はリストの1つの画像にのみ設定されており、スライドショーのように表示されます。

これについてもっと良い方法はありますか?

これが私のコードです:

カスタムアダプタ

class MyArrayAdapter extends ArrayAdapter<String> {

    private final Context context;
    private int i = 0;
    Contact[] myContact;
    String imageURL;

    public MyArrayAdapter(Context context, Contact[] contact) {
        super(context, R.layout.custom_list);
        this.context = context;
        this.myContact = contact;
        int s = myContact.length;
        int k = contact.length;
    }

    @Override
       public int getCount() {
           return myContact.length;
       }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        rowView = inflater.inflate(R.layout.custom_list, parent, false);
        TextView contact_first_name = (TextView) rowView
                .findViewById(R.id.first_name);
        TextView contact_last_name = (TextView) rowView
                .findViewById(R.id.last_name);
        imageView = (ImageView) rowView.findViewById(R.id.photo);
        imageURL = myContact[i].getImageUrl();          
        new LoadImageTask().execute(imageURL);

        contact_first_name.setText(myContact[i].getFirstName());
        contact_last_name.setText(myContact[i].getLastName());

        i++;

        return rowView;
    }       
}

非同期タスク

public class LoadImageTask extends AsyncTask<String, Integer, String> {

    Bitmap bitmap;

    @Override
    protected String doInBackground(String... imageURL) {
        // TODO Auto-generated method stub
        try {
              bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageURL[0]).getContent());

            } catch (MalformedURLException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
        return null;
    }

    protected void onPostExecute(String line) {

        try {
            imageView.setImageBitmap(bitmap);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

0

実行時にimageviewオブジェクトを渡します。
setTagを使用してURLを渡します。以下は問題を解決しますが、このチュートリアルをよく見ることをお勧めします。これにより、メモリ不足やパフォーマンスの問題が発生するのを防ぐことができます。

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        rowView = inflater.inflate(R.layout.custom_list, parent, false);
        TextView contact_first_name = (TextView) rowView
                .findViewById(R.id.first_name);
        TextView contact_last_name = (TextView) rowView
                .findViewById(R.id.last_name);
        imageView = (ImageView) rowView.findViewById(R.id.photo);
        imageURL = myContact[i].getImageUrl();
        imageView.setTag(imageURL);    // add this      
        new LoadImageTask().execute(imageView); // change here

        contact_first_name.setText(myContact[i].getFirstName());
        contact_last_name.setText(myContact[i].getLastName());

        i++;

        return rowView;
    }   

非同期タスクの場合:

public class LoadImageTask extends AsyncTask<ImageView, Integer, String> { // change here

    Bitmap bitmap;
   ImageView image = null; // add this

    @Override
    protected String doInBackground(String... imageURL) {
        // TODO Auto-generated method stub
    this.image = imageURL[0]; // add this
        String url = (String) image.getTag(); // add this

        try {
              bitmap = BitmapFactory.decodeStream((InputStream)new URL(url).getContent()); // change here

            } catch (MalformedURLException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
        return null;
    }

    protected void onPostExecute(String line) {

        try {
            image.setImageBitmap(bitmap); // change here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

これで問題が解決します。

于 2012-12-03T01:15:41.293 に答える