简体   繁体   English

Android-具有asynctask的Listview适配器可加载图像

[英]Android - Listview adapter with asynctask to load images

I'm trying to handle an image loading at the background. 我正在尝试在后台加载图像。

Now, I've look at the next link - here 现在,我看下一个链接- 这里

And I've got few things I don't understand - 我有几件事我不理解-

1) I've made the next CursorAdapter for the listview items- 1)我为listview项目制作了下一个CursorAdapter-

    public class ChatCursorAdapter extends CursorAdapter implements OnClickListener {


        public ChatCursorAdapter(Context context, Cursor c) {
            super(context, c, 0);
        }

        @Override
        public int getCount() {
            return getCursor() == null ? 0 : super.getCount();
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        @Override
        public int getItemViewType(int _position) {
            Cursor cursor = (Cursor) getItem(_position);
            return getItemViewType(cursor);
        }

          private int getItemViewType(Cursor cursor) {
                String sender = cursor.getString(2);

                   SharedPreferences userPref = PreferenceManager
                            .getDefaultSharedPreferences(MainChat.this);


                        String saveUser =   userPref.getString("user", "");

                        if (saveUser.equalsIgnoreCase(sender)){

                            return 0;
                        }else{
                            return 1;
                        }
          }

    @Override
        public void bindView(View view, Context context, Cursor cursor) {
            holder = (ViewHolder) view.getTag();
                holder.mesg.setText(getSmiledText(MainChat.this,msg));
            holder.mesg2.setText(getSmiledText(MainChat.this,msg2));
                    holder.myImage.setTag(picPath);
             holder.myImage.setImageBitmap(setImageToImageView(picPath));

}


        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            ViewHolder holder = new ViewHolder();
            View itemLayout = null;
            switch(getItemViewType(cursor)){
            case 0:
                itemLayout = getLayoutInflater().inflate(R.layout.msg_item1,parent, false);
                break;
            case 1:
                itemLayout =  getLayoutInflater().inflate(R.layout.msg_item13, parent,false);
                break;

            }


            itemLayout.setTag(holder);
            holder.mesg = (TextView) itemLayout.findViewById(R.id.text_start);
            holder.mesg2 = (TextView) itemLayout.findViewById(R.id.text_end);
            holder.myImage = (ImageView) itemLayout.findViewById(R.id.imageView_msgpic);
            return itemLayout;


}

Now i wnat to use the info from the link. 现在我要使用链接中的信息。

But i don't understand - What i need to pass into the and what to AsyncTask leave at CursorAdapter? 但是我不明白-我需要传递给什么以及AsyncTask留给CursorAdapter保留什么?

Also the sample code uses - 样例代码还使用-

.execute(holder);

Can't I call to the AsyncTask like this - 我不能像这样调用AsyncTask吗?

new AsyncTask().execute();

And how and where should i call the AsyncTask, I don't understand it? 我不知道该如何以及在何处调用AsyncTask?

Thanks for any kind of help 谢谢你的帮助

您始终可以使用外部库(例如Universal-Image-Loader或Picasso)来实现您要尝试执行的操作=)

Take a look at AsyncTask . 看看AsyncTask You must Override doInBackground method. 您必须重写doInBackground方法。 You may define a constructor to supply view in which you want to put downloaded image. 您可以定义一个构造函数以提供要在其中放置下载图像的视图。

public class ImageDownloader extends AsyncTask<String, Void, List<Bitmap>> {
private ImageView ivImageHolder;
private Context context;
public ImageDownloader(Context context, ImageView imageHolder) {
    this.ivImageHolder = imageHolder;
    this.context = context;
}
...
@Override
protected List<Bitmap> doInBackground(String... params) {
//This happens in background
    List<Bitmap> bitmaps = new ArrayList<Bitmap>();
    for (String url : params) {
        Bitmap bitmap = DownloadImage(url);
        bitmaps.add(bitmap);
    }
    return bitmaps;
}
....
private Bitmap DownloadImage(String URL) {
    Bitmap bitmap = null;
    InputStream in = null;
    try {
        in = OpenHttpConnection(URL);
        bitmap = BitmapFactory.decodeStream(in);
        in.close();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return bitmap;
}
...
private InputStream OpenHttpConnection(String urlString) throws IOException {
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection))
        throw new IOException("Not an HTTP connection");

    try {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        response = httpConn.getResponseCode();
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();
        }
    } catch (Exception ex) {
        throw new IOException("Error connecting");
    }
    return in;
}
@Override
protected void onPostExecute(List<Bitmap> bitmaps) {
    super.onPostExecute(bitmaps);
    for (int i = 0; i < bitmaps.size(); i++) {
        final Bitmap bitmap = bitmaps.get(i);
        ivImageHolder.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                new ImageViewActivity(context, bitmap).show();
            }
        });
        // iv.setImageBitmap(bitmap);
        ivImageHolder.setImageBitmap(bitmap);
        ivImageHolder.setVisibility(ImageView.VISIBLE);
    }
}

if you write your asyntask method I can say how can you use it, If it need to string value you can use like this: 如果您编写asyntask方法,我可以说如何使用它,如果需要字符串值,可以这样使用:

new your_async(context).execute(url) ;

But in my advice : you should use lazyadapter to use bitmaps on listview because there is a mermory issue if you do not pay attention properties of images. 但根据我的建议:您应该使用lazyadapter在listview上使用位图,因为如果您不注意图像的属性,则会出现内存问题。 here is link : stackoverfow 这是链接: stackoverfow

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM