2014-01-17 5 views
0

Мой ImageView продолжают повторяться на ListView каждые 6 пунктов здесь мой код для CustomAdapterПовторные ImageView на ListView

public class NewsAdapter extends ArrayAdapter<NewsContainer> { 

private Context context; 
private NewsContainer[] newsContainer; 

public NewsAdapter(Context context, int textViewResourceID, NewsContainer[] newsContainers) { 
    super(context, textViewResourceID, newsContainers); 
    this.newsContainer = newsContainers; 
    this.context = context; 
} 

@Override 
public long getItemId(int position){ 
    return position; 
} 

public View getView(int position, View view, ViewGroup parent){ 
    viewHolder holder = null; 
    if(view == null){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.news_listview, null); 

     holder = new viewHolder(); 
     holder.image = (ImageView) view.findViewById(R.id.thumbnail); 
     holder.title = (TextView) view.findViewById(R.id.title); 
     holder.created_date = (TextView) view.findViewById(R.id.created_date); 
     holder.category = (TextView) view.findViewById(R.id.category); 
     holder.post_count = (TextView) view.findViewById(R.id.post_count); 
     view.setTag(holder); 
    } else { 
     holder = (viewHolder) view.getTag(); 
    } 

    NewsContainer news = newsContainer[position]; 
    SimpleDateFormat format = new SimpleDateFormat("DD/MM/yyyy", Locale.US); 
    if(news != null){ 
     String date = format.format(news.getCreatedDate()); 
     holder.title.setText(news.getTitle()); 
     holder.post_count.setText(String.valueOf(news.getPostCount())); 
     holder.created_date.setText(date); 
     holder.category.setText(Html.fromHtml(news.getCategory())); 
     if(!news.getThumbnail().equals("empty")){ 
      new ImageDownloaderTask(holder.image).execute(news.getThumbnail()); 
     }  
    } 

    return view; 
} 

static class viewHolder { 
    ImageView image; 
    TextView title; 
    TextView created_date; 
    TextView category; 
    TextView post_count; 
} 

ImageDownloader класс

public class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { 

private final WeakReference<ImageView> imageViewWeakReference; 

public ImageDownloaderTask(ImageView imageView) { 
    this.imageViewWeakReference = new WeakReference<ImageView>(imageView); 
} 

@Override 
protected Bitmap doInBackground(String... params) { 
    return downloadBitmap(params[0]); 
} 

@Override 
protected void onPostExecute(Bitmap bitmap){ 
    if(isCancelled()){ 
     bitmap = null; 
    } 

    if(imageViewWeakReference != null){ 
     ImageView imageView = imageViewWeakReference.get(); 
     if(imageView != null){ 
      if(bitmap != null){ 
       imageView.setImageBitmap(bitmap); 
      } else { 
       imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.ic_loading_image)); 
      } 
     } 
    } 
} 

@TargetApi(Build.VERSION_CODES.FROYO) 
static Bitmap downloadBitmap(String url) { 
    final AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); 
    final HttpGet getRequest = new HttpGet(url); 
    try { 
     HttpResponse response = client.execute(getRequest); 
     final int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode != HttpStatus.SC_OK) { 
      Log.w("ImageDownloader", "Error " + statusCode 
        + " while retrieving bitmap from " + url); 
      return null; 
     } 

     final HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      InputStream inputStream = null; 
      try { 
       inputStream = entity.getContent(); 
       final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
       return bitmap; 
      } finally { 
       if (inputStream != null) { 
        inputStream.close(); 
       } 
       entity.consumeContent(); 
      } 
     } 
    } catch (Exception e) { 
     // Could provide a more explicit error message for IOException or 
     // IllegalStateException 
     getRequest.abort(); 
     Log.w("ImageDownloader", "Error while retrieving bitmap from " + url); 
    } finally { 
     if (client != null) { 
      client.close(); 
     } 
    } 
    return null; 
} 

Я попытался с помощью ViewHolder но ImageView продолжает повторять, и обнаружил, что ListView перерабатывает свой вид, чтобы сохранить занятость памяти низкой. но я не могу понять, как решить эту проблему.

+0

ли способ перехвата getCount() в вашем адаптере помогает? Здесь вы по существу возвращаете newsContainer.size(); – droidx

ответ

2

Вы должны очистить или сбросить изображение, если вы получили пустой значок в getView.

Письмо с моего телефона, извинения за краткость.

Редактировать: Я не вижу, что вы указали это в своем коде вообще. Где у вас есть, например:

if(news != null){ 
    String date = format.format(news.getCreatedDate()); 
    holder.title.setText(news.getTitle()); 
    holder.post_count.setText(String.valueOf(news.getPostCount())); 
    holder.created_date.setText(date); 
    holder.category.setText(Html.fromHtml(news.getCategory())); 
    if(!news.getThumbnail().equals("empty")){ 
     new ImageDownloaderTask(holder.image).execute(news.getThumbnail()); 
    }  
} 

что, если news является нулевым или news.getThumbnail().equals("empty") == true? Вы оставите изображение с переработанным изображением без изменений.

+0

У меня есть код установки для добавления изображения по умолчанию, когда изображение пуст, но все равно получите тот же результат. – Randy

+0

@ Randy Я до сих пор не вижу, что вы всегда очищаете старое изображение. См. Мое редактирование. – SK9

+0

TWIMC Почему проголосовало ...? – SK9

3
else { 
    holder = (viewHolder) view.getTag(); 
} 

Вот ваша реальная проблема, вы раздувания в случае view равна нулю, но не делать каких-либо изменений в случае, если он уже имеет значение. Когда view будет перерабатываться, он будет содержать некоторое значение и не будет равно нулю. Поэтому вам нужно изменить все значения вместо повторного использования существующих.

+0

большое спасибо, это то, что я искал. Я исправил эту проблему, добавив в файл change changer.image значение по умолчанию. – danigonlinea

+0

@ danigonlinea Я сталкиваюсь с одной и той же проблемой, могу ли вы поделиться кодовой строкой, которая была исправлена ​​для этого? спасибо – k2ibegin

+0

@ k2ibegin простая логика поможет вам решить вашу проблему. Когда вы начинаете прокрутку, представление, выходящее из экрана с одной стороны, возвращается как параметр в getview, а выборки для другой стороны. Это то же самое мнение, поэтому, если вы не меняете контент, он покажет вам только старый. Измените содержимое с помощью держателя. – Shakti

0
public View getView(int position, View view, ViewGroup parent){ 

if(view == null){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.news_listview, null); 
    } 

    ImageView image = (ImageView) view.findViewById(R.id.thumbnail); 
    TextView title = (TextView) view.findViewById(R.id.title); 
    TextView created_date = (TextView) view.findViewById(R.id.created_date); 
    TextView category = (TextView) view.findViewById(R.id.category); 
    TextView post_count = (TextView) view.findViewById(R.id.post_count); 

NewsContainer news = NewsContainer[position]; 
SimpleDateFormat format = new SimpleDateFormat("DD/MM/yyyy", Locale.US); 
if(news != null){ 
    String date = format.format(news.getCreatedDate()); 
    title.setText(news.getTitle()); 
    post_count.setText(String.valueOf(news.getPostCount())); 
    created_date.setText(date); 
    category.setText(Html.fromHtml(news.getCategory())); 
    if(!news.getThumbnail().equals("empty")){ 
     new ImageDownloaderTask(image).execute(news.getThumbnail()); 
    }  

} 
Смежные вопросы