2016-07-22 1 views
0

У меня проблема с моим адаптером 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() звонит в RetrofitonResponse() и ImageViewonClick().

я поставил точку останова в listViewInit() и его называли только один раз (как конструктор) ...

+0

Является ли метод loadFamousPicture названным 13 раз сразу после открытия активности или после выполнения прокрутки? – W0rmH0le

+0

@GuilhermeP сразу после открытия операции. Метод вызывается для позиций '0..9', а затем снова для этих позиций и снова - 13 раз. – y07k2

ответ

0

Попробуйте изменить метод changeData, как показано ниже:

public void changeData (List<NewsModel> newsList) { 
    if(mNewsList.size>0) 
     mNewsList.clear(); 
    this.mNewsList.addAll(newsList); 
    notifyDataSetChanged(); 
} 

Everytime когда вы заполняете данные в вашем favoritesModelList в onRespose (ЗАМЕНЫ), выше этой линии просто написать ниже linew

if(favoritesModelList!=null && favoritesModelList.size()>0) 
    favoritesModelList.clear(); 

После написания выше строк, наполнит ваш favoritesModelList в onResponse.

+0

Несчастливо это не поможет. – y07k2

+0

Показать код, с которого вы вызываете метод changeData – Drv

+0

вопрос теперь обновляется. – y07k2

Смежные вопросы