У меня проблема с моим адаптером ListView
.Метод адаптера ListView getView() загружает данные несколько раз для одного элемента после одного набора. Адаптер
Я использую 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 элемента), но это называется 13x10 раз (13 за каждый элемент изmNewsList
), и я не» t знаю почему ...
Любые идеи, почему так?
EDIT:
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()
и его называли только один раз (как конструктор) ...
Является ли метод loadFamousPicture названным 13 раз сразу после открытия активности или после выполнения прокрутки? – W0rmH0le
@GuilhermeP сразу после открытия операции. Метод вызывается для позиций '0..9', а затем снова для этих позиций и снова - 13 раз. – y07k2