RecyclerView
を使用してチャットアプリケーションを作成しようとしています。私はLinearLayoutManager
をsetReverseLayout(true)
と使用しています。RecyclerViewをスクロールして挿入する
データセットstart =最新のメッセージである下端までスクロールされ、新しいメッセージがデータセットに挿入されると、アイテムはリストの下部に期待通りに表示されます(ビューがスクロールされます)。新しいアイテムのためのスペースを確保するために)。
私が持っている問題は、古いメッセージを見るためにスクロールしたときです。新しいメッセージがデータセットの先頭に挿入されると、そのメッセージはビューポートの範囲外にあるためレンダリングされなくても、メッセージの高さは約1つ上にスクロールされます。
ビューを下にスクロールするとスクロール動作を維持できますが、古いメッセージにスクロールしたときにスクロール動作を無効にするにはどうすればよいですか。
はUPDATE:私は私が同様に作られたレポに加工修正を犯し: https://github.com/ehehhh/RecyclerViewProblem
UPDATE 2: は、私はまた、この問題が再現される小さなアプリケーションを、作られました。
関連するコード(願わくは):
compile 'com.android.support:recyclerview-v7:24.2.0'
XML:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="8dp"
android:paddingTop="8dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
RecyclerView初期化コード:
layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
layoutManager.setReverseLayout(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setScrollContainer(true);
recyclerView.setLayoutAnimation(null);
recyclerView.setItemAnimator(null);
adapter = new ChatAdapter(...);
recyclerView.setAdapter(adapter);
アダプタ:
public class ChatAdapter extends RecyclerView.Adapter<ChatViewHolder> {
private List<MessageWrapper> dataset;
public ChatAdapter(List<MessageWrapper> dataset, ...) {
this.dataset = dataset;
setHasStableIds(true);
}
...
@Override
public long getItemId(int position) {
return dataset.get(position).getId();
}
@Override
public int getItemCount() {
return dataset.size();
}
public void datasetChanged(List<MessageWrapper> dataset) {
this.dataset = dataset;
notifyDataSetChanged();
}
}
新しいアイテムがデータセットに追加されたとき、私はちょうどアダプタでdatasetChanged
メソッドを呼び出します。あなたはアイテムが を変更知っているあなたがた働いたものを、この特定のケースでは
notifyItemInserted(position)
を使用できるかどうnotifyDataSetChangedが冗長で使用してリサイクラービューで
あなたはデータセット全体を更新するのですか? または新しい行を挿入するだけですか? –
リストの先頭に項目を追加してから、 'notifyDatasetChanged()'を呼び出します。 – ehehhh
@ehehhh私はsetStackFromEnd(true)と同じ問題がありますか?それについての手がかりは? – ADM