Изображение, установленное в методе bindview, ведет себя смешно
Я решил заполнить свое представление списка с помощью реализации Cursor Adapter
и Cursor Loader
, так как я ожидаю большое количество содержимого списка (много строк) в своей деятельности.
То, что я делаю прямо сейчас
-
Сначала я извлекаю содержимое данных из своей базы данных sqlite и заполняю его в виде списка через метод bindview
в моем внутреннем классе DotCursorAdapter
, который расширяет Cursor Adapter
.
-
Во-вторых, я асинхронно загружаю изображение с моих серверов с помощью класса Async Task и устанавливаю его в метод imageview
через bindview
.
Все вышеописанное работает правильно, но изображение, загруженное в метод bindview
, ведет себя смешно: при выполнении изображение, которое предполагается установить в, например, list item 1
, обменивается с list item 4
и после некоторого времени он возвращается к норме, установив изображение в его первоначальный номер элемента списка.
Я действительно не понимаю, почему настройка изображения ведет себя так. Я сидел на этой проблеме около недели, и я до сих пор не могу понять, в чем проблема.
Мои коды для работы выше приведены ниже, пожалуйста, есть ли что-то, что я делаю неправильно, или есть лучший способ сделать то, что я хочу сделать. Буду признателен за это. Спасибо за помощь.
public class ListViewExample extends Activity implements LoaderCallbacks<Cursor> {
DotCursorAdapter mAdapter;
private ListView lv;
Context context = this;
private final int LOID = 500;
public static DatabaseHandler dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.list_main_activity, frameLayout);
lv = (ListView) findViewById(R.id.lists);
mAdapter = new DotCursorAdapter(this, null,1);
getSupportLoaderManager().initLoader(LOID, null, this);
lv.setAdapter(mAdapter);
Urlimage = "http://www.mysiteimage.com/";
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return new DumbLoader(this);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
mAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
mAdapter.swapCursor(null);
}
/**
* DumbLoader sub class
*/
public static class DumbLoader extends CursorLoader {
public DumbLoader(Context context) {
super(context);
}
@Override
public Cursor loadInBackground() {
Cursor c = dbHelper.fetchAllListViewExample();
return c;
}
}
public final class DotCursorAdapter extends CursorAdapter {
public DotCursorAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, 0);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.ListViewExample, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
/**
* image Data from the local database
*/
final String imageName = cursor.getString(cursor.getColumnIndexOrThrow("msgTitle"));
//This is the the image url name
final String imageFull= (Urlimage+imageName);
//Place various views variable in the layout view
final ImageView imageView= (ImageView) view.findViewById(R.id.ciView);
//This downloads the image and set it to its view
if(imageName== null || imageName.length() == 0|| imageName.equalsIgnoreCase("null")) {
imageView.setImageResource(R.drawable.sample);
}else{
new URLimageDownload(imageView).execute(imageFull);
}
}
}
/**
* This sub class that dowloads the image in the background
* using the async task.
*/
private class URLimageDownload extends AsyncTask<String, Void, Bitmap> {
ImageView imageDownloadView;
public URLimageDownload(ImageView imageDownloadView) {
this.imageDownloadView = imageDownloadView;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap bitmapImage = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
bitmapImage = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return bitmapImage;
}
protected void onPostExecute(Bitmap result) {
imageDownloadView.setImageBitmap(result);
}
}
}
Ответы
Ответ 1
Представления перерабатываются, поэтому при прокрутке вы делаете один запрос, и ответ будет поступать асинхронно в неправильную строку.
Чтобы решить эту проблему, вы должны использовать загрузчик изображений, например Picasso или Glide.
Оба они очень похожи и просты в использовании:
Итак, замените ваше связывание на что-то вроде этого
Glide.with(context)
.load(yourUrl)
.into(myImageView);