Java 从列表视图中的URL加载图像
我可以下载图像并在ListView中显示它。但我面临的问题是, 当我加载图像时,它们都会加载到列表的第一行。它显示正在第一行中逐个加载。而其他行保留默认图像。看起来很奇怪。怎么办。代码如下:Java 从列表视图中的URL加载图像,java,android,listview,Java,Android,Listview,我可以下载图像并在ListView中显示它。但我面临的问题是, 当我加载图像时,它们都会加载到列表的第一行。它显示正在第一行中逐个加载。而其他行保留默认图像。看起来很奇怪。怎么办。代码如下: private class simpsync extends AsyncTask<String, Integer , Bitmap>{ private final WeakReference imageViewReference;
private class simpsync extends AsyncTask<String, Integer , Bitmap>{
private final WeakReference imageViewReference;
simpsync(ImageView iv){
//imageView=iv;
imageViewReference=new WeakReference(iv);
}
@Override
protected Bitmap doInBackground(String... param) {
Bitmap bmp=CommonFunctions.overlay(CommonFunctions.loadUrlBitmap(param[0]));
return bmp;
}
protected void onPostExecute(Bitmap bitmap) {
//imageView.setImageBitmap(result);
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = (ImageView) imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
}
私有类simpsync扩展异步任务{
私有最终WeakReference imageViewReference;
simpsync(ImageView iv){
//imageView=iv;
imageViewReference=新的WeakReference(iv);
}
@凌驾
受保护位图doInBackground(字符串…参数){
位图bmp=CommonFunctions.overlay(CommonFunctions.loadUrlBitmap(param[0]);
返回bmp;
}
受保护的void onPostExecute(位图){
//设置图像位图(结果);
如果(isCancelled()){
位图=空;
}
if(imageViewReference!=null){
ImageView ImageView=(ImageView)imageViewReference.get();
如果(imageView!=null){
if(位图!=null){
设置图像位图(位图);
}
}
}
}
}
这段代码是BaseAdapter类的getView函数
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
ViewHolder holder;
if(convertView==null){
/****** Inflate tabitem.xml file for each row ( Defined below ) *******/
//list_book_detail_entry
if(requestType==SearchAndIndex.SEARCH_IN_SEPAERATE)
{
vi = inflater.inflate(R.layout.list_book_detail_buy, parent, false);
//vi = inflater.inflate(R.layout.list_book_detail_buy, null);
}
else{
vi = inflater.inflate(R.layout.list_book_detail_entry, parent, false);
//vi = inflater.inflate(R.layout.list_book_detail_entry, parent, false);
}
/****** View Holder Object to contain tabitem.xml file elements ******/
holder = new ViewHolder();
holder.bookTitle=(TextView)vi.findViewById(R.id.BookTitle);
holder.writer = (TextView) vi.findViewById(R.id.WriterName);
holder.imageUrl=(ImageView)vi.findViewById(R.id.ImageUrl);
holder.isbn=(TextView)vi.findViewById(R.id.BookISBN);
holder.serialNumber=(TextView)vi.findViewById(R.id.BookSerialNumber);
holder.availabilityView=(ImageView)vi.findViewById(R.id.AvailabilityView);
holder.publisher=(TextView)vi.findViewById(R.id.Publisher);
holder.publishingDate=(TextView)vi.findViewById(R.id.PublishingDate);
/************ Set holder with LayoutInflater ************/
vi.setTag( holder );
}
else
holder=(ViewHolder)vi.getTag();
if(data.size()<=0)
{
holder.bookTitle.setText("--");
holder.writer.setText("--");
holder.publisher.setText("--");
holder.publisher.setText("----+--+--");
}
else
{
tempValues=null;
tempValues = ( BookDetailsStruct ) data.get( position );
holder.writer.setText( tempValues.Writer );
holder.publisher.setText(tempValues.Publisher);
holder.publishingDate.setText(tempValues.getIssueDetail(0).publishingDate);
simpsync sp=new simpsync(holder.imageUrl);
if(requestType==SearchAndIndex.SEARCH_IN_SEPAERATE)
{
if(tempValues.getIssueDetail(0)!=null)
{
String toAdd;
if(tempValues.getIssueDetail(0).serialNumber==-1)
toAdd="";
else
toAdd=" [ 巻"+tempValues.getIssueDetail(0).serialNumber+" ]";
holder.bookTitle.setText( tempValues.BookName+toAdd);
sp.execute(tempValues.getIssueDetail(0).smallImageUrl);
}
}
else{
if(tempValues.largetNumberIndex!=-1)
{
String toAdd;
if(tempValues.getIssueDetail(tempValues.largetNumberIndex).serialNumber==-1)
toAdd="";
else
toAdd=" ("+tempValues.getIssueCount()+"巻)";
holder.bookTitle.setText( tempValues.BookName+toAdd);
sp.execute(tempValues.getIssueDetail(tempValues.largetNumberIndex).smallImageUrl);
}
else{
holder.bookTitle.setText( tempValues.BookName);
sp.execute(tempValues.getIssueDetail(0).smallImageUrl);
}
}
vi.setOnClickListener(new OnItemClickListener( position ));
}
return vi;
}
public View getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
视窗座;
if(convertView==null){
/******为每行(定义如下)膨胀tabitem.xml文件*******/
//列表\书籍\详细信息\条目
if(requestType==SearchAndIndex.SEARCH\u IN\u separate)
{
vi=充气机。充气(R.layout.list\u book\u detail\u buy,parent,false);
//vi=充气机。充气(R.layout.list\u book\u detail\u buy,空);
}
否则{
vi=充气机。充气(R.布局.列表\书本\详细信息\条目,父项,错误);
//vi=充气机。充气(R.布局.列表\书本\详细信息\条目,父项,错误);
}
/******要包含tabitem.xml文件元素的视图持有者对象******/
holder=新的ViewHolder();
holder.bookTitle=(TextView)vi.findViewById(R.id.bookTitle);
holder.writer=(TextView)vi.findViewById(R.id.WriterName);
holder.imageUrl=(ImageView)vi.findViewById(R.id.imageUrl);
holder.isbn=(TextView)vi.findViewById(R.id.BookISBN);
holder.serialNumber=(TextView)vi.findViewById(R.id.BookSerialNumber);
holder.availabilityView=(ImageView)vi.findViewById(R.id.availabilityView);
holder.publisher=(TextView)vi.findViewById(R.id.publisher);
holder.publishingDate=(TextView)vi.findViewById(R.id.publishingDate);
/************带压平机的固定架************/
vi.setTag(支架);
}
其他的
holder=(ViewHolder)vi.getTag();
if(data.size()可用于将图像加载到ListView
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
或
在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:
在适配器中处理ImageView
回收和下载取消
使用最少内存的复杂图像转换
自动内存和磁盘缓存
您可以使用将图像加载到ListView中
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
或
在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:
在适配器中处理ImageView
回收和下载取消
使用最少内存的复杂图像转换
自动内存和磁盘缓存
您可以使用将图像加载到ListView中
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
或
在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:
在适配器中处理ImageView
回收和下载取消
使用最少内存的复杂图像转换
自动内存和磁盘缓存
您可以使用将图像加载到ListView中
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
或
在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:
在适配器中处理ImageView
回收和下载取消
使用最少内存的复杂图像转换
自动内存和磁盘缓存
“问题”是ListView的循环行为。你没有充分尊重它。当你向下滚动,一个视图在顶部消失时,它将在底部重新使用(这就是为什么你使用ViewHolder模式,这很好)。但是你也启动了一个异步任务,给它ImageView并保留它。因为行的整个视图(由于imageview)被回收,它将不符合垃圾收集的条件,因此asynctask有一个有效的imageview,可以在完成后显示图像
为了更正您的代码,我建议您只需修改android开发者页面上所写的内容,这几乎就是复制过去的代码供您使用:
您也可以使用第三方库,因为其他聪明人也遇到了这个问题,并提出了很好的解决方案:
它们都有一个非常(非常)简单的Api来完成任务,并且它们都是高效的和可调的,并且已经有了很好的设置