我在android應用程序中使用listview。 我必須從網上下載不同的圖像,並將它們添加到每個列表元素下。 圖像下載,保存到SD卡以供將來參考和顯示正在按預期工作。Android Listview在滾動條上獲取重複元素
但是,當我嘗試滾動列表時,前幾個元素的一些圖像被複制或移動到最後一個元素。
這是非常奇怪的行爲,我從來沒有來到現在。
如果有人遇到同樣的問題,請幫助我。
在此先感謝。
我在android應用程序中使用listview。 我必須從網上下載不同的圖像,並將它們添加到每個列表元素下。 圖像下載,保存到SD卡以供將來參考和顯示正在按預期工作。Android Listview在滾動條上獲取重複元素
但是,當我嘗試滾動列表時,前幾個元素的一些圖像被複制或移動到最後一個元素。
這是非常奇怪的行爲,我從來沒有來到現在。
如果有人遇到同樣的問題,請幫助我。
在此先感謝。
一定要實現你的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;
}
}
滾動時它使用一個類來保存列表視圖每個項目的標籤。這樣,當您回滾到已經初始化的特定項目時,您的初始化將被回收。
我們如何在一個適配器元素中動態添加圖像而不會打擾其他圖像? 是否可以在適配器元素中動態添加視圖? – Rahul
你是什麼意思動態添加圖像?..單個項目中的圖像會不時變化?..如果這樣,一定要把所有的算法放在view.setTag – icaneatclouds
我在每個列表適配器元素。一個線程將繼續從網上下載圖像,並不斷增加布局。 下載作品,安置作品。但隨着我滾動列表視圖圖像被移動到其他列表適配器elemnets。 – Rahul
使用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年開始)
在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
時適用於我。
發佈您的代碼。 –
listview回收視圖。您可能會遇到問題,因爲您的適配器存在問題 – Raghunandan
。 –