2014-02-17 31 views
0

我在android應用程序中使用listview。 我必須從網上下載不同的圖像,並將它們添加到每個列表元素下。 圖像下載,保存到SD卡以供將來參考和顯示正在按預期工作。Android Listview在滾動條上獲取重複元素

但是,當我嘗試滾動列表時,前幾個元素的一些圖像被複制或移動到最後一個元素。

這是非常奇怪的行爲,我從來沒有來到現在。

如果有人遇到同樣的問題,請幫助我。

在此先感謝。

+2

發佈您的代碼。 –

+5

listview回收視圖。您可能會遇到問題,因爲您的適配器存在問題 – Raghunandan

+0

。 –

回答

1

一定要實現你的ListView適配器上回收。這裏是具有回收列表視圖適配器的樣本:

public class NewsAdapter extends ArrayAdapter<NewsDto> { 
    private final Context context; 
    ArrayList<NewsDto> nList; 

    public NewsAdapter(Context context, ArrayList<NewsDto> nList) { 
     super(context, R.layout.fragment_news_item, nList); 
     this.context = context; 
     this nList = nList; 
     // TODO Auto-generated constructor stub 
    } 

    public class ViewHolder { 
     TextView description; 
     ImageView image1 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final ViewHolder holder; 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) { 
      view = inflater.inflate(R.layout.fragment_news_item, parent, false); 
      holder = new ViewHolder(); 
      holder.description = (TextView) view 
        .findViewById(R.id.news_description); 
      holder.image1 = (ImageView) view.findViewById(R.id.news_image1); 
      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 
    // get a single data from your list. 
    NewsDto newsDto= nlist.get(position); 

    //initialization of Image 
    holder.image1.setImageBitmap(newsDto.getImage()); 

     return view; 

    } 

} 

滾動時它使用一個類來保存列表視圖每個項目的標籤。這樣,當您回滾到已經初始化的特定項目時,您的初始化將被回收。

+0

我們如何在一個適配器元素中動態添加圖像而不會打擾其他圖像? 是否可以在適配器元素中動態添加視圖? – Rahul

+0

你是什麼意思動態添加圖像?..單個項目中的圖像會不時變化?..如果這樣,一定要把所有的算法放在view.setTag – icaneatclouds

+0

我在每個列表適配器元素。一個線程將繼續從網上下載圖像,並不斷增加布局。 下載作品,安置作品。但隨着我滾動列表視圖圖像被移動到其他列表適配器elemnets。 – Rahul

0

使用ViewHolder模式,並保持成Android的回收查看帳戶,您的適配器getView是這樣的(多個僞代碼):

public View getView(ViewGroup parent, View convertView, int position) { 
    ViewHolder holder = null; 
    if(convertView == null) { 
     convertView = inflater.inflate(...); 
     holder = new ViewHolder(); 
     // initialize view holder views from inflated convertView 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    // update each ViewHolder's View with relevant information 
    return convertView; 
} 

有關該機制如何工作的更多細節,看看在這個受歡迎的Google IO presentation(從2010年開始)

0

getView()方法的開始製作convertView = null。即

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

    ViewHolder holder = new ViewHolder(); 
    convertView = null; 

    if (convertView == null) { 
       // your code 
      }else{ 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      // your code 
     } 

這將停止回收ListView元素。它在我加載太多項目和滾動ListView時適用於我。