2017-01-01 4 views
0

У меня возникла проблема с заполнением ImageView в моем ListView.
Проблема в том, что все изображения заполняются в одном и том же месте (в представлении изображения самого нижнего списка). Я вижу, как изображение загружается быстро, пока они заполняются.Все изображения загружаются в том же месте в ListView

public class TheaterListAdapter extends ArrayAdapter<ConstantsTheaterList> implements IResult { 

    private ViewHolder viewHolder; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     if (convertView==null){ 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.fragment_theater_list_item, parent, false); 

      viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView) convertView.findViewById(R.id.theater_list_item_image); 
      viewHolder.textViewLatitude = (TextView) convertView.findViewById(R.id.theater_list_item_latitude); 
      viewHolder.textViewLongitude = (TextView) convertView.findViewById(R.id.theater_list_item_longitude); 
      viewHolder.textViewVicinity = (TextView) convertView.findViewById(R.id.theater_list_item_vicinity); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     //Picasso.with(getContext()).load(uri.toString()).into(mImageView); [WORKS FINE] 

     // Using Volley to fetch image from the web. 
     new VolleyService(mContext, this).volleyImageRequest(uri.toString(), 100, 100); 


     String latitude = getItem(position).latitude; 
     String longitude = getItem(position).longitude; 
     String vicinity = getItem(position).vicinity; 

     viewHolder.textViewLatitude.setText(latitude); 
     viewHolder.textViewLongitude.setText(longitude); 
     viewHolder.textViewVicinity.setText(vicinity); 

     return convertView; 
    } 

    //These are the callbacks that I receive in my Volley implementation. Now, I fill the bitmap once they are available. 
    @Override 
    public void notifySuccess(Object response) { 
     Bitmap bitmap = (Bitmap) response; 
     viewHolder.imageView.setImageDrawable(bitmap); 
    } 

    @Override 
    public void nofifyError(Object volleyError) { 
     Log.e(TAG, (String)volleyError); 
    } 


    private static class ViewHolder{ 
     ImageView imageView; 
     TextView textViewLatitude; 
     TextView textViewLongitude; 
     TextView textViewVicinity; 
    } 


} 

Я считаю, что это должно быть из-за того, что виды переработаны.

Однако все работает нормально, когда я использую пикассо.

Как исправить то же самое?

+0

«Проблема в том, что все изображения заполняются в одном месте» - это потому, что вы не заполняете изображение в правильную «ViewHolder». Вместо использования «ViewHolder», связанного с запросом, вы используете любое «ViewHolder», находящееся в поле «viewHolder», которое будет тем, что вы недавно встретили «ViewHolder». Вам нужно сделать лучшую работу по связыванию запроса Volley с соответствующим «ImageView». Лично я просто использую Пикассо. – CommonsWare

+1

@CommonsWare Пожалуйста, ответьте подробно сэр.Я не получаю должным образом. –

+0

@SumitJha в методе getView, вы используете залп для загрузки изображений асинхронно. К тому времени, когда волейбол загружает изображение, изменяется местоположение, в котором отображается указатель. Чтобы решить эту проблему, вы можете использовать библиотеки загрузки изображений, использовать recyclerview или использовать анонимный класс при создании сервиса волейбола. –

ответ

2

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что вы не используете Внимательно посмотрите держатель.
Понимаете, у владельца есть экземпляр, связанный с каждой ячейкой. Здесь, при вызове методы «Volley», чтобы загрузить ПОС, а затем через этот метод обратного вызова вы заселить ImageView, используя «ViewHolders» экземпляра, что экземпляр какой-то образом связан с последней ячейкой ListView.

Есть еще одна проблема, что вы не передаете экземпляр ячейки, для которой вы загружаете рис. Экземпляр неуместен.

Вы можете использовать Пикассо для этого или UniversalImageLoader. В качестве этих библиотек вы можете передать экземпляр imageview той конкретной ячейки, для которой вы загружаете изображение.
Пример:

Picasso.with (это) .load ("ВАШ URL изображения ЗДЕСЬ") в (ViewHolder.imageView);.
Вот и все. Вы хорошо идти ...

+0

Спасибо, помощник за вашу помощь :) –

0

Для всех там, кто еще хотел бы понять, почему это не работает, и хотел бы, чтобы исправить это таким образом, вот как это сделать:

Everytime вы вызываете свой метод для извлечения изображения в фоновом режиме, вам нужно также передать экземпляр imageView, где должно быть размещено это изображение.

Вот пример, где я использовал AsyncTask для получения изображения.

public class TheaterListAdapter extends ArrayAdapter<ConstantsTheaterList> 

    private ViewHolder viewHolder; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     if (convertView == null) { 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.fragment_theater_list_item, parent, false); 

      viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView) convertView.findViewById(R.id.theater_list_item_image); 
      viewHolder.textViewLatitude = (TextView) convertView.findViewById(R.id.theater_list_item_latitude); 
      viewHolder.textViewLongitude = (TextView) convertView.findViewById(R.id.theater_list_item_longitude); 
      viewHolder.textViewVicinity = (TextView) convertView.findViewById(R.id.theater_list_item_vicinity); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     String key = mContext.getResources().getString(R.string.google_maps_key); 
     String photoReference = getItem(position).photo_reference; 
     String maxWidth = getItem(position).max_width; 
     String maxHeight = getItem(position).max_height; 
     String url = "https://maps.googleapis.com/maps/api/place/photo?"; 

     Uri uri = Uri.parse(url).buildUpon() 
       .appendQueryParameter("key", key) 
       .appendQueryParameter("maxwidth", maxWidth) 
       .appendQueryParameter("maxheight", maxHeight) 
       .appendQueryParameter("photoreference", photoReference) 
       .build(); 

     //Picasso.with(getContext()).load(uri.toString()).into(mImageView); 

     //new VolleyService(mContext, this).volleyImageRequest(uri.toString(), 100, 100); 

     // Preparing input for MyAsyncTask... 
     Object[] object = new Object[2]; 
     object[0] = uri.toString(); 
     object[1] = viewHolder.imageView; // This is **important** 
              //Pass the instance of imageview where the image is supposed to be filled. 

     //Calling AsyncTask... 
     MyAsyncTask myAsyncTask = new MyAsyncTask(); 
     myAsyncTask.execute(object); 


     String latitude = getItem(position).latitude; 
     String longitude = getItem(position).longitude; 
     String vicinity = getItem(position).vicinity; 

     viewHolder.textViewLatitude.setText(latitude); 
     viewHolder.textViewLongitude.setText(longitude); 
     viewHolder.textViewVicinity.setText(vicinity); 

     return convertView; 
    } 
    private static class ViewHolder { 
     ImageView imageView; 
     TextView textViewLatitude; 
     TextView textViewLongitude; 
     TextView textViewVicinity; 
    } 

    private static class MyAsyncTask extends AsyncTask<Object, Void, Bitmap>{ 

     private String url; 
     private ImageView imageView; 
     @Override 
     protected Bitmap doInBackground(Object... params) { 

      url = (String) params[0]; 
      Log.v(TAG, url); 
      imageView = (ImageView) params[1]; 

      return Utility.ImageHttp.read(url); // my method to fetch the image and return the Bitmap. 
     } 

     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      imageView.setImageBitmap(bitmap); 
     } 
    } 
} 

Теперь, когда вы поняли, вы можете использовать Пикассо для этой цели. Но важно понять, почему это не сработало в первую очередь.