2017-12-08 5 views
1

私はチャットアプリを作成しています。下からスタートし、上にスクロールするなど、逆の方法でリサイクルビューの無限スクロールを実装しようとしています。RecyclerViewリバースエンドレススクロール

ユーザーがチャット画面を開くと、アプリは最後の20個のメッセージを取得し、デフォルトでは下にスクロールします。私は、ユーザーがスクロールアップすると、サーバーからさらに多くのメッセージを取得したい。

以下は、私がテストしていただ、一般的な無限スクロールコードです:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     layoutManager = new LinearLayoutManager(this); 
     recyclerView = (RecyclerView)findViewById(R.id.recyclerview); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setHasFixedSize(true); 


     adapter = new RecyclerViewAdapter<String, ItemViewHolder>(String.class,R.layout.item,ItemViewHolder.class,list) { 
      @Override 
      protected void populateViewHolder(ItemViewHolder viewHolder, String model, int position) { 
       if(model != null){ 
        viewHolder.textView.setText(model); 
       } 
      } 
     }; 
     recyclerView.setAdapter(adapter); 
     recyclerView.setOnScrollListener(new EndlessReverseRecyclerViewScrollListener(layoutManager) { 
      @Override 
      public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { 
       loadMore(); 
      } 
     }); 
     loadInit(); 
    } 

    private void loadInit(){ 
     for(int x = 0; x < 20;x++){ 
      list.add(list.size()+": "+getRandomString(8)); 
      adapter.notifyDataSetChanged(); 
     } 
     layoutManager.scrollToPosition(list.size() -1); 
    } 

    private void loadMore(){ 
     for(int x = 0; x < 20;x++){ 
      list.add(list.size()+": "+getRandomString(8)); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

無限スクロールクラス

public EndlessReverseRecyclerViewScrollListener(LinearLayoutManager layoutManager) { 
     this.layoutManager = layoutManager; 
    } 

    // This happens many times a second during a scroll, so be wary of the code you place here. 
    // We are given a few useful parameters to help us work out if we need to load some more data, 
    // but first we check if we are waiting for the previous load to finish. 
    @Override 
    public void onScrolled(RecyclerView view, int dx, int dy) { 
     int lastVisibleItemPosition = 0; 
     int totalItemCount = layoutManager.getItemCount(); 



     if (layoutManager instanceof StaggeredGridLayoutManager) { 
      int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null); 
      // get maximum element within the list 
      lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions); 
     } else if (layoutManager instanceof GridLayoutManager) { 
      lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); 
     } else if (layoutManager instanceof LinearLayoutManager) { 
      lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); 
     } 

     Log.d(TAG," *** last visible: "+lastVisibleItemPosition); 
     Log.d(TAG," *** total: "+totalItemCount); 
     // If the total item count is zero and the previous isn't, assume the 
     // list is invalidated and should be reset back to initial state 
     if (totalItemCount < previousTotalItemCount) { 
      this.currentPage = this.startingPageIndex; 
      this.previousTotalItemCount = totalItemCount; 
      if (totalItemCount == 0) { 
       this.loading = true; 
      } 
     } 
     // If it’s still loading, we check to see if the dataset count has 
     // changed, if so we conclude it has finished loading and update the current page 
     // number and total item count. 
     if (loading && (totalItemCount > previousTotalItemCount)) { 
      loading = false; 
      previousTotalItemCount = totalItemCount; 
     } 

     // If it isn’t currently loading, we check to see if we have breached 
     // the visibleThreshold and need to reload more data. 
     // If we do need to reload some more data, we execute onLoadMore to fetch the data. 
     // threshold should reflect how many total columns there are too 
     if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) { 
      currentPage++; 
      onLoadMore(currentPage, totalItemCount, view); 
      loading = true; 
     } 
    } 

    // Call this method whenever performing new searches 
    public void resetState() { 
     this.currentPage = this.startingPageIndex; 
     this.previousTotalItemCount = 0; 
     this.loading = true; 
    } 

    // Defines the process for actually loading more data based on page 
    public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view); 

これは、上から下にスクロールするために完璧に動作しますが、誰かが上の支援くださいすることができどのように私は下から上に動作させることができます。ありがとう

P.S. ReverseLayoutは私が探している解決策ではありません。なぜなら、それは私のアイテムの順序を逆転させ、それが私が達成しようとしているものではないからです。

答えて

2

私はブール(あなたがこの方法

LinearLayoutManager.setReverseLayout(真)

を探していると信じて、あなたのアイテムが下からスタックしたくない場合は別途

setStackFromEndを設定)をLinearLayoutManagerのfalseに設定する

+0

そして、Recyclerのレイアウトを設定する前にLinearLayoutManagerに直接設定することを忘れないでください – Rainmaker