28

新しいアイテムがリストに追加されたときに RecyclerView を一番下までスクロールしたい。以下は私のコードです:

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);

adapter = new RecyclerViewAdapter(data, recyclerView);
recyclerView.setAdapter(adapter);

の下にあるボタンをクリックするとRecyclerView、データがリストに追加されます。

public void addNewCard() {
    data.add("New");
    adapter.notifyItemInserted(data.size() - 1);
    recyclerView.scrollToPosition(data.size() - 1);
}

アイテムを追加するたびに、常に一番上の位置までスクロールされます。使ってsmoothScrollToPosition()みたり、つけてみたり。私も使ってみました。依存関係のバージョンも変更しようとしました。Stack Overflow で徹底的に検索しましたが、どのソリューションも機能しません。scrollToPosition()LinearLayoutManagerViewTreeObserverRecyclerView

何が問題になる可能性があるかについてのアイデアはありますか? RecyclerViewフラグメント内で使用しています。それが問題の原因になる可能性はありますか?

私の.xmlファイルRecyclerView

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll_view_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent">

<RelativeLayout
    android:id="@+id/rel_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp" />

    <Button
        android:id="@+id/button_add_new_card"
        style="@style/Widget.AppCompat.Button.Borderless"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/listView"
        android:layout_marginBottom="16dp"
        android:layout_marginTop="8dp"
        android:padding="20dp"
        android:text="+ Add new Item" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
4

8 に答える 8

25

setStackFromEnd()リストの一番下にデータを追加する場合は、RecyclerView レイアウト マネージャーで使用する必要があります。

ただし、最初に、アダプターを修正する必要があります。RecylerView をアダプタに渡してはなりません。したがって、次のコードは間違っています。

...
// This is wrong!!
adapter = new RecyclerViewAdapter(data, recyclerView);

recyclerView.setAdapter(adapter);

パラメータとしてデータのみを受け取るようにアダプタ コンストラクタを変更する必要があります。このようなもの:

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

  private List<Data> mData;

  public RecyclerViewAdapter(List<Data> data) {
    this.mData = data;
  }

  ...
}

次に、次のコードを使用して、常に最後の最後に追加されるようにデータを設定できます。

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);

adapter = new RecyclerViewAdapter(data);
recyclerView.setAdapter(adapter);

新しいデータを追加するには、アダプターで新しいメソッドを作成することをお勧めします。このようなもの:

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

  private List<Data> mData;
  ...

  public void addItem(Data datum) {
    mData.add(datum);
    notifyItemInserted(mData.size());
  }
}

新しいデータを追加するときはいつでも、メソッドで一番下までスクロールする必要がありますscrollToPosition。このようなもの:

adapter.addItem(newData);
recyclerView.scrollToPosition(adapter.getItemCount() - 1);

getItemCount()Adapter でオーバーライドする必要があることに注意してください。次のようになります。

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

  private List<Data> mData;
  public RecyclerViewAdapter(List<Data> data) {
    this.mData = data;
  }

  // Return the total count of items
  @Override
  public int getItemCount() {
    return mData.size();
  }

  ...
}

ここではサンプルとして Data pojo を使用していることに注意してください。データ型に応じて変更する必要があります。

于 2017-11-13T05:33:35.947 に答える