虽然位图似乎正确,但变量“ userBitmap”将保持为空。但是,当在平板电脑上向上或向下滚动时,新的列表行将包含图片,但它们都是相同的,而且是错误的。真的,真的很困惑。我尝试了多种不同的方法来从网络上获取图像。非常感谢您的帮助。

我的自定义适配器:

public class MessagesArrayAdapter extends ArrayAdapter<ChatData>
{
    Bitmap userBitmap;

public MessageArrayAdapter(Context context, List<ChatData> objects)
{
    super(context, 0, objects);
}

public View getView(int position, View convertView, ViewGroup parent)
{
    ChatCell chatCell = new ChatCell();

    LayoutInflater inflater = LayoutInflater.from(getContext());
    convertView = inflater.inflate(R.layout.cell_chat, parent, false);

    chatCell.usernameTextView = (TextView) convertView.findViewById(R.id.usernameTextView);
    chatCell.messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
    chatCell.userImageView = (ImageView) convertView.findViewById(R.id.userImageView);

    ChatData chatData = getItem(position);

    // Get user image from web
    new loadImageAsync().execute(chatData.avatarURL);

    chatCell.userImageView.setImageBitmap(userBitmap);
    chatCell.usernameTextView.setText(chatData.username);
    chatCell.messageTextView.setText(chatData.message);

    return convertView;
}



private static class ChatCell
{
    TextView usernameTextView;
    TextView messageTextView;
    ImageView userImageView;
}

private class loadImageAsync extends AsyncTask<String, Void, Double>{
    @Override
    protected Double doInBackground(String... params) {

        userBitmap = loadImage(params[0]);


        return null;
    }
}


public Bitmap loadImage(String str) {

    InputStream instream = null;
    try {
        HttpGet httpRequest = new HttpGet(URI.create(str));
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
        HttpEntity entity = response.getEntity();
        BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
        instream = bufHttpEntity.getContent();
        Bitmap myBitmap = BitmapFactory.decodeStream(instream);

        return myBitmap;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        //close input
        if (instream != null) {
            try {
                instream.close();
            } catch (IOException ioex) {
                // Handle error
            }
        }
    }

}


}

评论

我会用毕加索过上幸福的生活。

#1 楼

解决问题的最简单方法是使用某些库,例如Picasso。当图像太大时,它不仅易于使用并使代码更易于阅读,而且还可以防止出现OutOfMemory异常。然后,加载图像只需一行即可:

Picasso.with(context)
.load(urlOfYourImage)
.resize(50, 50) // here you resize your image to whatever width and height you like
.into(imageView)


评论


天啊。这是给我的。

–user2892437
15年4月29日在22:56

希望这可以帮助。只是简化。 ;)

–杰里
15年4月29日在22:58

一切都在一行代码中运行。不敢相信。您认为我仍然应该使用异步吗?

–user2892437
15年4月29日在23:29

将这行代码添加到build.gradle中的依赖项:compile'c​​om.squareup.picasso:picasso:2.5.2'

–杰里
16年5月14日在17:56

#2 楼

我认为您在这里遇到了两个问题:

1)视图回收-我本人还是Android的新手,使用列表视图时,当列表视图的某些部分移出屏幕时,这种情况经常出现,向后滚动时可能会出错。我个人有一个问题,即上下滚动时,按钮状态更改为错误的行。本教程详细介绍了“回收”,并在对我有用的View Holder私有类中提供了解决方案。我确定SO的其他部分也都在谈论这一点。

2)图片为空-这肯定是作为null出现的,还是只是不出现在列表视图中?如果是前者,则LoadImage()中的某些步骤一定不能正常工作。如果是后者,则可能需要在设置图像后尝试调用notifyDataSetChanged(),以告知主线程可以绘制图像。如下所示(在您的AsyncTask中):

@Override
protected void onPostExecute() {
       notifyDataSetChanged();
    }
}


评论


感谢您的评论。 notifyDataSetChange();帮助了。现在,所有视图都有图片。但是,它们都是相同的,并且每秒更改一次(而文本视图保持相同/正确)。我认为这与在getView()之外定义的“ userBitmap”有关。有更好的方法吗?

–user2892437
2015年4月29日在22:19