我有一个带有ArrayAdapter的ListView,它显示新闻。在新闻之间,我会预载一些本地广告,并在预留位置展示它们。但是,此视图内部的OnClickListener仅在我第一次添加该视图时才起作用-如果用户向下滚动经过该视图,然后又向上备份,则在单击该视图时没有任何反应。
我该如何解决?
public class NewsListAdapter extends ArrayAdapter<Article> {
private List<NativeAdNews> nativeAds;
public void setData(List<Article> data) {
dataset.clear();
dataset.addAll(data);
loadAdFromNetwork(() -> {
LayoutInflater inflater = LayoutInflater.from(getContext());
NativeAdNews nativeAdView = (NativeAdNews) inflater.inflate(R.layout.item_news_nativead, null);
nativeAdView.setNativeAd(ad.getName(), ad.getWebsite());
nativeAds.add(nativeAdView);
Article a = new Article();
a.setId("nativead" + (nativeAds.size() - 1));
dataset.add(position, a);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Article article = dataset.get(position);
if(article.getId().startsWith("nativead")) {
int nativeAdPosition = Integer.parseInt(article.getId().replace("nativead", ""));
NativeAdNews nativeAdView = nativeAds.get(nativeAdPosition);
//nativeAdView.setClickListeners(); I tried manually re-setting the click listeners with no luck
return nativeAdView;
} else {
// reuse views
View rowView = convertView;
...
return rowView;
}
}
}
public class NativeAdNews extends FrameLayout {
private TextView advertiserTextView;
public void setNativeAd(String advertiserName, String advertiserWebsite) {
advertiserTextView.setText(advertiserName + " (" + advertiserWebsite + ")");
setClickListeners();
}
public void setClickListeners() {
advertiserTextView.setOnClickListener(v -> {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com"));
getContext().startActivity(i);
});
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
// setup ad
imageView = findViewById(R.id.image_view);
advertiserTextView = findViewById(R.id.advertiser);
...
}
}
也许您可以在ArrayAdapter中尝试“ ViewHolder”。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// viewHolder
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater inflater = LayoutInflater.from(getContext());
v = inflater.inflate(R.layout.item_news_nativead, null);
holder = new ViewHolder();
holder.news = (NativeAdNews) v;
v.setTag(holder)
} else {
holder = (ViewHolder) v.getTag();
}
holder.news.setClickListeners();
return v;
}
public class ViewHolder {
NativeAdNews news;
}