簡體   English   中英

ListView適配器的方法getView()在一組setAdapter之后為一項加載多次數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM