我的自定义适配器:
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'com.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
评论
我会用毕加索过上幸福的生活。