[英]ListView adapter's method getView() loads data multiple times for one item after one setAdapter
我的ListView
適配器有問題。
我正在使用ExpandableHeightListView
或只是基本的Android ListView
。
ListViewAdapter
類:
public class ListViewNewsAdapter extends BaseAdapter {
private Activity mActivity;
private List<NewsModel> mNewsList;
private String mPhotoUrl;
public ListViewNewsAdapter(Activity activity, List<NewsModel> famous, String photoUrl) {
mActivity = activity;
mNewsList = famous;
mPhotoUrl = photoUrl;
}
@Override
public int getCount() {
return mNewsList.size();
}
@Override
public Object getItem(int position) {
return mNewsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// if needed create own layout, `list_view_famous_news_single_item` is identical for now
convertView = inflater.inflate(R.layout.list_view_famous_news_single_item, parent, false);
}
final NewsModel news = mNewsList.get(position);
ViewHolder holder = new ViewHolder(convertView);
// not always shows the date, was 'news.getPagemap().getMetatags().get(0).getArticlePublishedTime()', sometimes is 'getArticle()' returns null...
holder.date.setText(news.getPagemap().getArticle().size() > 0 ? news.getPagemap().getArticle().get(0).getDatepublished() : news.getPagemap().getMetatags().get(0).getArticlePublishedTime());
holder.title.setText(news.getTitle());
holder.content.setText(news.getPagemap().getMetatags().get(0).getOgDescription());
holder.source.setText(news.getDisplayLink());
String photoUrl = news.getPagemap().getMetatags().get(0).getOgImage();
loadFamousPicture(mActivity, holder.progressBar, holder.photo, news.getPagemap().getMetatags().get(0).getOgImage(), mPhotoUrl);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(news.getLink()));
mActivity.startActivity(i);
}
});
holder.publicityBanner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showToast(mActivity, "publicityBanner");
}
});
return convertView;
}
public void changeData (List<NewsModel> newsList) {
mNewsList = newsList;
notifyDataSetChanged();
}
public class ViewHolder {
@BindView(R.id.dateTextView)
TextView date;
@BindView(R.id.titleTextView)
TextView title;
@BindView(R.id.contentTextView)
TextView content;
@BindView(R.id.sourceTextView)
TextView source;
@BindView(R.id.newsPhotoImageView)
ImageView photo;
@BindView(R.id.progressBar)
ProgressBar progressBar;
@BindView(R.id.publicityBanner)
LinearLayout publicityBanner;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
loadFamousProfile(...)
方法:
public static void loadFamousPicture(final Activity activity,
@Nullable final ProgressBar progressBar,
final ImageView imageView,
final String... photoUrls) {
if(progressBar != null)
progressBar.setVisibility(View.VISIBLE);
Glide
.with(activity)
.load(photoUrls[0])
.fallback(R.drawable.bg_gradient)
.error(R.drawable.bg_gradient)
.centerCrop()
.crossFade()
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
if (progressBar != null)
progressBar.setVisibility(View.GONE);
// if there is another picture to load
if (photoUrls.length > 1)
loadFamousPicture(activity, progressBar, imageView, Arrays.copyOfRange(photoUrls, 1, photoUrls.length));
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if (progressBar != null)
progressBar.setVisibility(View.GONE);
return false;
}
})
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
}
我的mNewsList
中有10個元素。.我在以下位置使用斷點:
constructor
:構造函數只調用一次-這當然是一件好事
與法系loadFamousPicture(...)
這個方法應該叫10倍(原因mNewsList
已得到10元),但它(從13%每一個元素稱為13x10倍mNewsList
),我不知道為什么?
任何想法為什么會這樣?
編輯:
changeData()
調用:
private void listViewInit() {
if (favoritesModelList.size() > 0) {
noDataTextView.setVisibility(View.GONE);
if (mIsListViewInited) {
mAdapter.changeData(favoritesModelList);
} else {
mAdapter = new ListViewMyFavouritesAdapter(getActivity(), favoritesModelList);
myFavouritesListView.setAdapter(mAdapter);
mIsListViewInited = true;
}
} else {
noDataTextView.setText(getString(R.string.favorites_no_data)); // TODO: which msg
noDataTextView.setVisibility(View.VISIBLE);
}
}
listViewInit()
調用Retrofit
onResponse()
和ImageView
onClick()
。
我在listViewInit()
設置了斷點,它只被調用過一次(就像構造函數一樣)...
嘗試如下更改changeData方法:
public void changeData (List<NewsModel> newsList) {
if(mNewsList.size>0)
mNewsList.clear();
this.mNewsList.addAll(newsList);
notifyDataSetChanged();
}
每當您在onRespose(Retrofit)中的收藏夾ModelList中填充數據時,只要在該行上方寫在linew下方
if(favoritesModelList!=null && favoritesModelList.size()>0)
favoritesModelList.clear();
在編寫完上述幾行之后,在onResponse中填充您的favoriteModelList。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.