Изображение, установленное в методе 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);