0

Я создал бесконечный список, чтобы иметь дело с моей страницей, исходящей из API, я получаю данные следующей страницы в JSON и анализирую мою деятельность. Но мой адаптер не обновляет новые элементы. Я вызвал notifyDataSetChanged, и он просто не обновляется. Любая идея, что я делаю неправильно? Вот мой код ниже:(Pagination) Бесконечный список из API - Android Recycler View

private void loadData(final boolean firstLoad) { 

    mDataFactory.getPostFeed(mThreads.getId(), mCurrentPage, new PostFeedDataFactory.PostFeedDataFactoryCallback() { 
     @Override 
     public void onPostDataReceived(PostResponse response) { 
      mData = response; 
      if (mData.getItems() != null) { 
       for (int i = 0; i < mData.getItems().size(); i++) { 
        Posts singlePost = response.getItems().get(i); 
        postList.add(singlePost); 
       } 
       if (firstLoad) { 
        mIsLoading = false; 
        mData.getItems().clear(); 
        mData.getItems().addAll(postList); 


        mEmoticonDataFactory.getEmoticonFeed(new EmoticonFeedDataFactory.EmoticonFeedDataFactoryCallback() { 
         @Override 
         public void onEmoticonDataReceived(EmoticonResponse response) { 
          mEmoticon = response; 
          populateUIWithData(); 
         } 

         @Override 
         public void onEmoticonDataFailed(Exception exception) { 

         } 
        }); 

       } else { 
        mIsLoading = false; 
        refreshPosts(postList); 
       } 

       if (mData.getItems().size() > 0) { 
        if (Integer.valueOf(mData.getTotalPosts()) >= response.getItems().size()) { 
         mCurrentPage++; 
        } else { 
         mIsLastPage = true; 
        } 
       } 

      } 
     } 

     @Override 
     public void onPostDataFailed(Exception exception) { 
     } 
    }); 


} 

private void populateUIWithData() { 

    mThreadText = (TextView) findViewById(R.id.threadText); 


    if (mThreads != null) { 
     if (mThreads.getName() != null) { 
      mThreadText.setText(mThreads.getName()); 
     } 
    } 
    if (mAdapter == null){ 
     mAdapter = new PostAdapter(this, mData, mEmoticon); 
     mRecyclerView.setAdapter(mAdapter); 
    } else { 
     mAdapter.setData(postList); 
     mAdapter.notifyDataSetChanged(); 
    } 

    mRecyclerView.addOnScrollListener(paginationListener); 


} 

private RecyclerView.OnScrollListener paginationListener = new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     int visibleItemCount = mLayoutManager.getChildCount(); 
     int totalItemCount = mLayoutManager.getItemCount(); 
     int firstVisibleItemPosition = mLayoutManager.findFirstVisibleItemPosition(); 

     if (!mIsLoading && !mIsLastPage) { 
      if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount) { 
       loadMoreItems(); 
      } 
     } 
    } 
}; 

private void loadMoreItems() { 
    mIsLoading = true; 
    loadData(false); 
} 

private void refreshPosts(ArrayList<Posts> newObjects) { 
    postList.addAll(newObjects); 
    populateUIWithData(); 

} 

Кроме того, здесь мой адаптер

PostAdapter.java

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Posts posts = mPost.getItem(position); 
    emoticons = mEmoticon.getItems(); 
    String message = null; 
    String emoMessage = null; 

    if (posts.getPost() != null) { 
     if (posts.getPost().getMessage() != null) { 
      message = posts.getPost().getMessage(); 
      emoMessage = message; 


      if (emoticons != null) { 
       for(Emoticons emoticon : this.emoticons) { 
        if (message.contains(emoticon.getEmoticon().getCode())) { 
         emoMessage = message.replaceAll(Constants.EMO_REGEX, emoticon.getEmoticon().getUrl()); 
        } 

       } 
      } 
     } 

     if (posts.getPost().getUsername() != null) { 
      holder.mAuthorTextView.setText("Posted by: " + posts.getPost().getUsername()); 
     } 

     if (posts.getPost().getHighlighting().equals("op")) { 
      holder.mPostTextView.setTypeface(Typeface.DEFAULT_BOLD); 
     } 

     } 

      holder.mPostTextView.setText(Html.fromHtml(emoMessage, new Html.ImageGetter() { 
       @Override 
       public Drawable getDrawable(String source) { 
        Drawable d = null; 
        try { 
         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
         StrictMode.setThreadPolicy(policy); 
         URL url = new URL(source); 
         InputStream is = url.openStream(); 
         Bitmap b = BitmapFactory.decodeStream(is); 
         d = new BitmapDrawable(Resources.getSystem(), b); 
         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        return d; 
       } 
      }, new Html.TagHandler() { 
       @Override 
       public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { 
        if(tag.equalsIgnoreCase("strike") || tag.equals("s")) { 
         processStrike(opening, output); 
        } 
       } 
       private void processStrike(boolean opening, Editable output) { 
        int len = output.length(); 
        if(opening) { 
         output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK); 
        } else { 
         Object obj = getLast(output, StrikethroughSpan.class); 
         int where = output.getSpanStart(obj); 

         output.removeSpan(obj); 

         if (where != len) { 
          output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 
        } 
       } 

       private Object getLast(Editable text, Class kind) { 
        Object[] objs = text.getSpans(0, text.length(), kind); 

        if (objs.length == 0) { 
         return null; 
        } else { 
         for(int i = objs.length;i>0;i--) { 
          if(text.getSpanFlags(objs[i-1]) == Spannable.SPAN_MARK_MARK) { 
           return objs[i-1]; 
          } 
         } 
         return null; 
        } 
       } 

      })); 

    } 

@Override 
public int getItemCount() { 
    return mPost.getItems().size(); 
} 

public void setData(ArrayList<Posts> array) { 
    ArrayList<Posts> postList = this.mPost.getItems(); 
    postList = array; 
} 
+0

Я на своем смартфоне, так что не могу понять весь ваш код, но рассмотрели ли вы один из расширений RecycleView, таких как SuperRecycleView или UltimateRecycleView? У них есть встроенные функции, которые позволяют загружать больше результатов, когда пользователь прокручивает – cYrixmorten

+0

Нет. Я не знал, что они вообще существуют. Я попробовал EndlessRecyclerAdapter и прикрепил к нему свой адаптер, но это, похоже, не работало. @cYrixmorten – BilalMH

+0

Я предлагаю вам отредактировать фрагмент кода до минимального, полного и проверенного примера (http://stackoverflow.com/help/ mcve) - это поможет с упором на соответствующие части –

ответ

0

Я нашел ответ благодаря @cYrixmorten я изменил мой метод УстановитьДанные смотреть например

public void setData(ArrayList<Posts> array) { 
    mPost.getItems().addAll(array); 
} 

I базовый я просто забыл обновить свой адаптер, чтобы заполнить для меня ... Но я просто хочу сказать спасибо тем, кто помог. :)

+0

УДИВИТЕЛЬНО!; D Великий вы получили его работу – cYrixmorten

+0

@cYrixmorten спасибо, чувак, как я вам дам? – BilalMH

+0

Тогда я должен был бы написать ответ, который вы принимаете, но не нужно, а не здесь для пунктов: -P – cYrixmorten