1

不用說,我遇到了很多針對此特定問題的建議解決方案。我刪除scrollListener並在我的片段內部實現它,我使用notifyItemRangeInserted而不是notifyDataSetChanged。問題是,這些解決方案都沒有爲我工作......我在我的應用程序中顯示了一組youtube視頻。我的數據集確實更新了;事情是,當我向下滾動,在某些點上滾動位置移動到頂部,即我的數據集在這裏的第一個項目是我的活動的一個片段:滾動時在recyclerview中更新數據集將滾動發送到頂部

private void setUpRecyclerView() 
{ 
    mRecyclerView.setHasFixedSize(true); 
    linearLayoutManager = new LinearLayoutManager(getActivity()); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      totalItemCount = linearLayoutManager.getItemCount(); 
      lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 
      if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) 
      { 
       loadMorePosts(); 
       loading = true; 
      } 
     } 
    }); 

    initAdapter(); 
} 

private void initAdapter() 
{ 
    adapter = new MyAdapter(mDataSet, getActivity()); 
    mRecyclerView.setAdapter(adapter); 
    skeletonScreen = Skeleton.bind(mRecyclerView) 
      .adapter(adapter) 
      .shimmer(true) 
      .angle(30) 
      .duration(1200) 
      .count(10) 
      .load(R.layout.youtube_item) 
      .show(); 
} 

private void loadVideos(final OnLoadPlayListCallback videosCallback, String pageToken) 
{ 
    Call<FullChannelPlayListData> mcallPlayList = mYouTubeService.getPlayList(
      Tags.VALUE_SNIPPET, 
      20, 
      mPlayListId, 
      getActivity().getResources().getString(R.string.youtube_data_api_key), 
      pageToken 
      ); 

    mcallPlayList.enqueue(new Callback<FullChannelPlayListData>() { 
     @Override 
     public void onResponse(Call<FullChannelPlayListData> call, Response<FullChannelPlayListData> response) { 
      if (response.code() == 200) 
      { 
       Log.d("FullPlayListSuccessful", response.message()); 
       videosCallback.onSuccessfulRequest(response.body()); 
      } 
      else Log.d("FullPlayListUnsuccess", response.message()); 

     } 

     @Override 
     public void onFailure(Call<FullChannelPlayListData> call, Throwable t) { 
      videosCallback.onFailureRequest(t); 
     } 
    }); 
} 

@Override 
public void onSuccessfulRequest(FullChannelPlayListData fullChannelPlayListData) 
{ 
    Log.d(TAG, "onSuccessfulRequest Item size = "+ fullChannelPlayListData.getItems().size()); 
    if (StringUtils.isNotEmpty(mNextPageToken)) 
     removeFooter(); 

    for (FullPlayListItems mItem: fullChannelPlayListData.getItems()) 
    { 
     FullPlayListItems randomItem = getVideoFromDataSet(mItem.getSnippet().getResourceId().getVideoId(), mDataSet); 
     if (randomItem == null) { 
      mDataSet.add(mItem); 
     } 
    } 

    adapter.notifyItemRangeInserted(adapter.getItemCount(), mDataSet.size()); 

    mRecyclerView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      skeletonScreen.hide(); 
     } 
    }, 2000); 


    mNextPageToken = fullChannelPlayListData.getNextPageToken(); 
    setLoaded(); 

} 

public void setLoaded() { 
    loading = false; 
} 

我會用真的可以使用一些幫助...

UPDATE MyAdapter類

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 
{ 

    private List<FullPlayListItems> mDataSet; 
    private Context mActivity; 
    private static final int YOUTUBE_ITEM_VIEW_TYPE = 0; 
    private static final int PROGRESS_BAR_ITEM_VIEW_TYPE = 1; 

    public MyAdapter(List<FullPlayListItems> mDataSet, Context mActivity) { 
     this.mDataSet = mDataSet; 
     this.mActivity = mActivity; 
    } 


    public class ProgressViewHolder extends RecyclerView.ViewHolder 
    { 
     @BindView(R.id.pBarLoadMorePosts) 
     ProgressBar pBarLoadMore; 

     public ProgressViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
     } 
    } 


    @Override 
    public int getItemViewType(int position) { 
     return mDataSet.get(position) != null ? YOUTUBE_ITEM_VIEW_TYPE : PROGRESS_BAR_ITEM_VIEW_TYPE; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     RecyclerView.ViewHolder viewHolder; 
     if (viewType == PROGRESS_BAR_ITEM_VIEW_TYPE) 
     { 
      View pBarLayoutView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.footer_loader, parent, false); 
      viewHolder = new ProgressViewHolder(pBarLayoutView); 
     } 
     else 
     { 
      View postItemLayoutView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.youtube_item, parent, false); 
      viewHolder = new YoutubeItemViewHolder(postItemLayoutView); 
     } 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    { 
     int viewType = getItemViewType(position); 
     FullPlayListItems mVideoItem = mDataSet.get(position); 

     switch (viewType) 
     { 
      case PROGRESS_BAR_ITEM_VIEW_TYPE: 
       ProgressViewHolder progressViewHolder = (ProgressViewHolder) holder; 
       progressViewHolder.pBarLoadMore.getIndeterminateDrawable().setColorFilter(CoreApplication.getRes().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN); 
       break; 
      case YOUTUBE_ITEM_VIEW_TYPE: 
      default: 
       YoutubeItemViewHolder youtubeItemViewHolder = (YoutubeItemViewHolder) holder; 
       youtubeItemViewHolder.mVideoTitle.setText(mVideoItem.getSnippet().getTitle()); 
       youtubeItemViewHolder.sdvYoutubeThumbnail.setImageURI(Uri.parse(mVideoItem.getSnippet().getThumbnails().getHigh().getUrl())); 

     } 
    } 


    @Override 
    public int getItemCount() { 
     return mDataSet != null ? mDataSet.size() : 0; 
    } 

    public class YoutubeItemViewHolder extends RecyclerView.ViewHolder 
    { 
     TextView mVideoTitle; 
     SimpleDraweeView sdvYoutubeThumbnail; 

     public YoutubeItemViewHolder(View itemView) 
     { 
      super(itemView); 
      mVideoTitle = (TextView)itemView.findViewById(R.id.tv_video_title); 
      sdvYoutubeThumbnail = (SimpleDraweeView)itemView.findViewById(R.id.sdv_thumbnail); 
     } 
    } 
} 

這裏是我的onViewCreated:

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mPlayListId = getArguments().getString(Tags.YT_CHANNEL_PLAYLIST_ID); 
    setUpRecyclerView(); 
    // Like I said initially mNextPageToken is empty 
    loadVideos(this, mNextPageToken); 
} 
+0

如何在loadMorePost() –

+0

更新您的適配器的數據集它只是利用改造網絡的請求......如果一切順利,我只是因爲提供的回調爲成功request..So我適配器已經在onViewCreated中初始化,我只需要更新onSuccessfulRequest()內的itemCount() –

+0

您可以請分享該代碼以供參考 –

回答

0

只需通知onSuccessfulRequest()方法中的數據更改。

adapter.notifyDataSetChanged(); 
+0

這也行不通(這是我最初做的第一件事)......這就是爲什麼我決定試試其他通知方法帖子我在這裏讀到的SO用戶遇到同樣的問題 –

+0

你是否清除了你的數據集? – Saneesh

+0

不...只是更新它 –

0

我不知道這個答案對你有幫助。無論如何請嘗試,

在活動添加這個方法將你MyAdapter

public void addItem(VideoSectionsActivity item){ 
mDataSet.add(item); 
notifyItemInserted(mDataSet.size() - 1); 
} 

,改變你的onSuccessfulRequest()

@Override 
public void onSuccessfulRequest(FullChannelPlayListData fullChannelPlayListData) 
{ 
    Log.d(TAG, "onSuccessfulRequest Item size = "+ fullChannelPlayListData.getItems().size()); 
    if (StringUtils.isNotEmpty(mNextPageToken)) 
     removeFooter(); 

    for (FullPlayListItems mItem: fullChannelPlayListData.getItems()) 
    { 
     FullPlayListItems randomItem = getVideoFromDataSet(mItem.getSnippet().getResourceId().getVideoId(), mDataSet); 
     if (randomItem == null) { 
      adapter.addItem(mItem); 
     } 
    } 



    mRecyclerView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      skeletonScreen.hide(); 
     } 
    }, 2000); 


    mNextPageToken = fullChannelPlayListData.getNextPageToken(); 
    setLoaded(); 

} 

更新

而且還重新安排你的代碼

private void setUpRecyclerView() 
{ 
    mRecyclerView.setHasFixedSize(true); 
    linearLayoutManager = new LinearLayoutManager(getActivity()); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 
    initAdapter(); 
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      totalItemCount = linearLayoutManager.getItemCount(); 
      lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 
      if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) 
      { 
       loadMorePosts(); 
       loading = true; 
      } 
     } 
    }); 

}

+0

同一件事在這裏交配.....數據集被更新,但仍然在向下滾動時,滾動位置突然移動到我列表的頂部(第1項) –

相關問題