2016-02-24 5 views
1

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

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class CustomListAdapter extends BaseAdapter { 
    private ArrayList listData; 
    private LayoutInflater layoutInflater; 

    public CustomListAdapter(Context context, ArrayList listData) { 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_row_layout, null); 
      holder = new ViewHolder(); 
      holder.headlineView = (TextView) convertView.findViewById(R.id.title); 
      holder.reporterNameView = (TextView) convertView.findViewById(R.id.reporter); 
      holder.reportedDateView = (TextView) convertView.findViewById(R.id.date); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     NewsItem newsItem = (NewsItem) listData.get(position); 
     holder.headlineView.setText(newsItem.getHeadline()); 
     holder.reporterNameView.setText("By, " + newsItem.getReporterName()); 
     holder.reportedDateView.setText(newsItem.getDate()); 
     if (holder.imageView != null) { 
      new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl()); 
     } 
     return convertView; 
    } 

    static class ViewHolder { 
     TextView headlineView; 
     TextView reporterNameView; 
     TextView reportedDateView; 
     ImageView imageView; 
    } 
} 

мой новость класс

public class NewsItem { 

    private String headline; 
    private String reporterName; 
    private String date; 
    private String url; 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public String getHeadline() { 
     return headline; 
    } 

    public void setHeadline(String headline) { 
     this.headline = headline; 
    } 

    public String getReporterName() { 
     return reporterName; 
    } 

    public void setReporterName(String reporterName) { 
     this.reporterName = reporterName; 
    } 

    public String getDate() { 
     return date; 
    } 

    public void setDate(String date) { 
     this.date = date; 
    } 

    @Override 
    public String toString() { 
     return "[ headline=" + headline + ", reporter Name=" + reporterName + " , date=" + date + "]"; 
    } 
} 

мой imageDownloaderTask

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.ImageView; 

import org.apache.http.HttpStatus; 

import java.io.InputStream; 
import java.lang.ref.WeakReference; 
import java.net.HttpURLConnection; 
import java.net.URL; 

class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public ImageDownloaderTask(ImageView imageView) { 
     imageViewReference = 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 (imageViewReference != null) { 
      ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       if (bitmap != null) { 
        imageView.setImageBitmap(bitmap); 
       } else { 
        Drawable placeholder = imageView.getContext().getResources().getDrawable(R.drawable.placeholder); 
        imageView.setImageDrawable(placeholder); 
       } 
      } 
     } 
    } 
    private Bitmap downloadBitmap(String url) { 
     HttpURLConnection urlConnection = null; 
     try { 
      URL uri = new URL(url); 
      urlConnection = (HttpURLConnection) uri.openConnection(); 
      int statusCode = urlConnection.getResponseCode(); 
      if (statusCode != HttpStatus.SC_OK) { 
       return null; 
      } 

      InputStream inputStream = urlConnection.getInputStream(); 
      if (inputStream != null) { 
       Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
       return bitmap; 
      } 
     } catch (Exception e) { 
      urlConnection.disconnect(); 
      Log.w("ImageDownloader", "Error downloading image from " + url); 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
     } 
     return null; 
    } 
} 
+2

Попробуйте добавить окончательное до того ViewHolder декларации как 'окончательного ViewHolder viewHolder;' – Jas

+0

нет его не working..thanks –

ответ

1
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class CustomListAdapter extends BaseAdapter { 
    private ArrayList listData; 
    private LayoutInflater layoutInflater; 

    public CustomListAdapter(Context context, ArrayList listData) { 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_row_layout, null); 
      holder = new ViewHolder(); 
      holder.headlineView = (TextView) convertView.findViewById(R.id.title); 
      holder.reporterNameView = (TextView) convertView.findViewById(R.id.reporter); 
      holder.reportedDateView = (TextView) convertView.findViewById(R.id.date); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     NewsItem newsItem = (NewsItem) listData.get(position); 
     holder.headlineView.setText(newsItem.getHeadline()); 
     holder.reporterNameView.setText("By, " + newsItem.getReporterName()); 
     holder.reportedDateView.setText(newsItem.getDate()); 

     Drawable placeholder = holder.imageView.getContext().getResources().getDrawable(R.drawable.placeholder; 
       holder.imageView.setImageDrawable(placeholder);  

      new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl()); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView headlineView; 
     TextView reporterNameView; 
     TextView reportedDateView; 
     ImageView imageView; 
    } 
+0

первый набор заставки image to ImageView программно, а затем загрузить изображение снова установите его оригинальное изображение –

+0

Yea. его работа таким образом. Drawable placeholder = holder.imageView.getContext(). getResources(). getDrawable (R.drawable.placeholder; holder.imageView.setImageDrawable (placeholder), но когда я прокручиваю, изображение исчезает и снова появляется. .благодаря –

0

Ьгу это. измените ваш getView.

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    view=convertView; 
    if (convertView == null) { 
     view = layoutInflater.inflate(R.layout.list_row_layout, null); 
     holder = new ViewHolder(); 
     holder.headlineView = (TextView) view.findViewById(R.id.title); 
     holder.reporterNameView = (TextView) view.findViewById(R.id.reporter); 
     holder.reportedDateView = (TextView) view.findViewById(R.id.date); 
     holder.imageView = (ImageView) view.findViewById(R.id.thumbImage); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    NewsItem newsItem = (NewsItem) listData.get(position); 
    holder.headlineView.setText(newsItem.getHeadline()); 
    holder.reporterNameView.setText("By, " + newsItem.getReporterName()); 
    holder.reportedDateView.setText(newsItem.getDate()); 
    if (holder.imageView != null) { 
     new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl()); 
    } 
    return view; 
} 

and declare Просмотреть представление как переменную уровня, надеюсь, что это поможет. См Здесь https://androidruler.wordpress.com/2016/02/21/android-custom-listview-example/

+0

он не работает, получая NullPointer исключение .. В любом случае спасибо за respnose ..:) –

+0

@KBJ я отредактировал ответ возврата возврата ответа в конце getview. it wil work –

+0

, но получение снова nullpointer exception..thanks .. –

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