2017-01-30 72 views
0

我正在使用AsyncTask将图像加载到我的ListView中。但是,当我运行该应用程序时,图片的顺序会随着滚动而改变。我怀疑getView()方法可能是错误的。但我找不到解决这个问题的方法。在ListView中滚动时加载AsyncTask的图像顺序发生变化

对于Android来说相对较新,我无法探索很多选择。

这里是我的代码:

DisplayPlacements.java

package com.example.android.areainfo; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ListView; 

public class DisplayPlacements extends AppCompatActivity { 
    ListView listView; 

    private String[] imageURLArray = new String[]{ 
      "http://farm8.staticflickr.com/7315/9046944633_881f24c4fa_s.jpg", 
      "http://farm4.staticflickr.com/3777/9049174610_bf51be8a07_s.jpg", 
      "http://farm8.staticflickr.com/7324/9046946887_d96a28376c_s.jpg", 
      "http://farm3.staticflickr.com/2828/9046946983_923887b17d_s.jpg", 
      "http://farm4.staticflickr.com/3810/9046947167_3a51fffa0b_s.jpg", 
      "http://farm4.staticflickr.com/3773/9049175264_b0ea30fa75_s.jpg", 
      "http://farm4.staticflickr.com/3781/9046945893_f27db35c7e_s.jpg", 
      "http://farm6.staticflickr.com/5344/9049177018_4621cb63db_s.jpg", 
      "http://farm8.staticflickr.com/7307/9046947621_67e0394f7b_s.jpg", 
      "http://farm6.staticflickr.com/5457/9046948185_3be564ac10_s.jpg", 
      "http://farm4.staticflickr.com/3752/9046946459_a41fbfe614_s.jpg", 
      "http://farm8.staticflickr.com/7403/9046946715_85f13b91e5_s.jpg", 
      "http://farm8.staticflickr.com/7315/9046944633_881f24c4fa_s.jpg", 
      "http://farm4.staticflickr.com/3777/9049174610_bf51be8a07_s.jpg", 
      "http://farm8.staticflickr.com/7324/9046946887_d96a28376c_s.jpg", 
      "http://farm3.staticflickr.com/2828/9046946983_923887b17d_s.jpg", 
      "http://farm4.staticflickr.com/3810/9046947167_3a51fffa0b_s.jpg", 
      "http://farm4.staticflickr.com/3773/9049175264_b0ea30fa75_s.jpg", 
      "http://farm4.staticflickr.com/3781/9046945893_f27db35c7e_s.jpg", 
      "http://farm6.staticflickr.com/5344/9049177018_4621cb63db_s.jpg", 
      "http://farm8.staticflickr.com/7307/9046947621_67e0394f7b_s.jpg", 
      "http://farm6.staticflickr.com/5457/9046948185_3be564ac10_s.jpg", 
      "http://farm4.staticflickr.com/3752/9046946459_a41fbfe614_s.jpg", 
      "http://farm8.staticflickr.com/7403/9046946715_85f13b91e5_s.jpg"}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_display_placements); 

     listView = (ListView) findViewById(R.id.listPlacements); 
     ImageAdapter imageAdapter = new ImageAdapter(this, R.layout.row, imageURLArray); 
     listView.setAdapter(imageAdapter); 
    } 
} 

activity_display_placements.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_display_placements" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.example.android.areainfo.DisplayPlacements"> 



    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/listPlacements"> 

    </ListView> 
</LinearLayout> 

row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/testImage" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:scaleType="centerCrop" /> 

</LinearLayout> 

ImageAdapter.java

package com.example.android.areainfo; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 

import java.io.IOException; 
import java.net.URL; 

/** 
* Created by User on 30-Jan-17. 
*/ 

public class ImageAdapter extends ArrayAdapter<String> { 
    private String[] imageURLArray; 
    private LayoutInflater inflater; 

    public ImageAdapter(Context context, int textViewResourceId, 
         String[] imageArray) { 
     super(context, textViewResourceId, imageArray); 
     // TODO Auto-generated constructor stub 

     inflater = ((Activity)context).getLayoutInflater(); 
     imageURLArray = imageArray; 
    } 

    private static class ViewHolder { 
     String imageURL; 
     ImageView imageView; 
     Bitmap bitmap; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder viewHolder = null; 
     if(convertView == null) { 
      convertView = inflater.inflate(R.layout.row, null); 

      viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView)convertView.findViewById(R.id.testImage); 
      convertView.setTag(viewHolder); 
     } 

     viewHolder = (ViewHolder)convertView.getTag(); 
     viewHolder.imageURL = imageURLArray[position]; 
     new DownloadAsyncTask().execute(viewHolder); 
     return convertView; 
    } 

    private class DownloadAsyncTask extends AsyncTask<ViewHolder, Void, ViewHolder> { 

     @Override 
     protected ViewHolder doInBackground(ViewHolder... params) { 
      // TODO Auto-generated method stub 
      //load image directly 
      ViewHolder viewHolder = params[0]; 
      try { 
       URL imageURL = new URL(viewHolder.imageURL); 
       viewHolder.bitmap = BitmapFactory.decodeStream(imageURL.openStream()); 
      } catch (IOException e) { 
       // TODO: handle exception 
       Log.e("error", "Downloading Image Failed"); 
       viewHolder.bitmap = null; 
      } 

      return viewHolder; 
     } 

     @Override 
     protected void onPostExecute(ViewHolder result) { 
      // TODO Auto-generated method stub 
      if (result.bitmap == null) { 
       // result.imageView.setImageResource(R.drawable.postthumb_loading); 
      } else { 
       result.imageView.setImageBitmap(result.bitmap); 
      } 
     } 
    } 
} 

帮助赞赏。

谢谢!

+0

使用'Picasso' http://square.github.io/picasso/ –

+0

请加一线得到视图 字符串mImageURL = this.getItem(位置); viewHolder.imageURL = mImageURL; // imageURLArray [position]; 再更换第二线,同时增加图像的URL到viewholder –

+0

你的ListView的项目得到回收/滚动时重用。如果你已经读了一下这个网站,你会遇到这一百次。几乎每一位程序员都偶然发现这一点。所以谷歌和搜索。有这么多的准备好用于你的问题的例子。 – greenapps

回答

0

您应该改用RecyclerView。这不是主要问题,但recyclerview是填充列表的更优化方式。

你可以找到一个很好的例子here

,并加载图像使用的图像加载库像glidePicasso 这是很容易做的事情以这种方式。

你可以找到一个很好的完整的例子here

+0

比我想的要好得多。使用毕加索,就像一个魅力! –

相关问题