android - 在适配器内进行一些网络操作

标签 android listview adapter runnable stackmob

我正在开发一个Android应用程序,其中有一个显示一些用户的 ListView 。因此我想在这个 ListView 中显示他们的图片,所以我这样做:

private class StableArrayAdapter extends ArrayAdapter<Request>{
    private Context context;
    private Bitmap tempobmp;
    private List<User> mylist;
    public StableArrayAdapter(Context context,List<User> mylist){
        super(context, R.layout.request_layout, mylist);
        this.context = context;
        this.mylist = mylist;
    }
    public class ViewHolder{
        public ImageView image;
      }
    public View getView(int position,View convertView,ViewGroup parent){
        View vi = convertView;
        if(vi==null){
            ViewHolder holder = new ViewHolder()
            holder.image = (ImageView) vi.findViewById(R.id.requestImage);
        }
        final ViewHolder holder = (ViewHolder) vi.getTag();
        User s = mylist.get(position);
        try{

            final URL url = new URL(myapp.getUser().getPhoto().getS3Url());
            Thread thread = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      try{
                        InputStream is = (InputStream) url.getContent();

                        Bitmap bmp = BitmapFactory.decodeStream(is);

                        tempobmp=bmp;

                      }
                      catch(Exception e){
                          Log.d("eeeeA52","eeeeA52"+e);
                      }
                  }
            });
            thread.start(); 
            thread.wait();

        }
        catch(Exception e){
            Log.d("eeeeAF","eeeeAF"+e);
        }
        holder.image.setImageBitmap(tempobmp);
      return vi;
    }

我可以放入线程中的所有日志告诉我,从数据库获取位图没有问题,但是当我使用此 ListView 启动页面时,图像仍然是默认图像。是否可以在适配器中使用线程来检索网络数据?如果是的话,最好的做法是什么?

谢谢大家:)

最佳答案

通常,直接从适配器进行网络调用被认为是一个坏主意。但如果您实际上无法在填充 ListView 之前在 Activity/fragment 中执行下载,您可以使用执行此操作的众多库之一,例如 Volley它有一个专门用于此目的的networkimageview对象。或者您可以使用Picasso专门为从网络下载图像并在常规 imageView 中显示而构建的库

两者都有详细的文档记录并且易于使用。 (Picasso 需要 1 行代码)

关于android - 在适配器内进行一些网络操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21224550/

相关文章:

Android Web Kit 和如何使用 Web Kit?

android - 透明的AppBarLayout,其中包含CardView

android - 使用 SimpleCursorAdapter 和 SQLite 在 ListView 中反转顺序

recyclerView 中的 android 微调器无法正常工作

java - 将文件图像文件复制到可绘制文件时出现错误

android - 有没有什么办法可以使填充缩放到字体大小?

android - 使用 Edittext 值查询 SQLite,然后在 ListView 中显示结果

c# - 基于 C# 中搜索文本框的文本将 ListView CollectionViewSource 滚动到一组项目

java - 从数组创建适配器(AutoCompleteTextView)

android - ListView clickEvent 选择了错误的数据库行 ID - 帮助!