Listview ArrayAdapter自定义项onClickListener只能在第一次使用

问题描述 投票:0回答:1

我有一个带有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);
        ...
    }
}
android android-listview android-arrayadapter onclicklistener
1个回答
0
投票

也许您可以在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;
}
© www.soinside.com 2019 - 2024. All rights reserved.