Android RecyclerView将项目添加到顶部,无需回收站视图滚动(如Instagram)

时间:2017-04-12 16:10:25

标签: android scroll android-recyclerview

我有一个RecyclerView,我想在它的顶部添加新项目,但我不希望RecyclerView滚动其内容。我希望用户在添加新项目之前查看与相同的项目

我试过这个但是效果不好:

index = ((LinearLayoutManager)mLayoutManager).findFirstVisibleItemPosition() + response.items.size();
View v = ((RecyclerView)mListView).getChildAt(0);
top = (v == null) ? 0 : v.getTop();

// Insert new datas..
...

// Notify my adapter
myAdapter.notifyDataSetChanged();

// Stay on the same previous position
((LinearLayoutManager)mLayoutManager).scrollToPositionWithOffset(index, top);

我想要做的是在用户滚动到顶部时加载旧评论(如在Instagram应用程序上)。

非常感谢你们!

3 个答案:

答案 0 :(得分:0)

您可以使用var gulp = require('gulp'); var uglify = require('gulp-uglify'); var sass = require('gulp-ruby-sass'); var plumber = require('gulp-plumber'); var livereload = require('gulp-livereload'); var prefix = require('gulp-autoprefixer'); /* ===== HTML TASKS ===== */ gulp.task('html', function(){ gulp.src('index.html') .pipe(livereload()); }); /* ===== SCRIPT TASKS ===== */ //Uglifies gulp.task('scripts', function(){ gulp.src('js/*.js') .pipe(plumber()) .pipe(uglify()) .pipe(gulp.dest('js/minjs')); }); /* ===== STYLE TASKS ===== */ //compiling and compressing scss files gulp.task('styles', function () { return sass('scss/**/*.scss', { style: 'compressed' }) .on('error', sass.logError) .pipe(gulp.dest('css')) .pipe(livereload()); }); /* ===== WATCH ===== */ //watches JS and SCSS gulp.task('watch', function(){ livereload.listen(); gulp.watch('index.html', ['html']); gulp.watch('js/*.js', ['scripts']); gulp.watch('scss/*', ['styles']); }); /* ===== DEFAULT ===== */ gulp.task('default', ['scripts', 'styles', 'watch']); 方法中的notifyItemRangeInserted方法代替RecyclerView.Adapter方法,在recyclerView的顶部插入项目。

notifyDataSetChanged

当您尝试在recyclerView顶部添加项目时,您的positionStart将为0,而itemCount是您在recyclerView之上添加的项目数。

答案 1 :(得分:0)

我有类似的问题,我设法解决了。

我使用了一个列表,并在后台线程中添加了此列表末尾的数据。 但在RecyclerView中,我以相反的顺序显示数据。为此,我对物品进行了反转。我的适配器中的索引(如下所示:invertedPosition = listSize - 1 - position)。

在这种情况下,我遇到的问题与你描述的完全一样。

为了解决这个问题,我做了两处修改: 1)摆脱适配器中位置的反转; 2)在LinearLayoutManager中打开reverseLayout选项(通过setReverseLayout(true)调用)

而且,瞧,一切都按原样运作。

希望它也能帮到你。

答案 2 :(得分:0)

在将数据插入回收器视图中并希望保留在顶部时,可以将AdapterDataObserver添加到视图适配器:

class Model extends ChangeNotifier {

  bool error = false;

  func() {

    try {

    await execute();
    error = false

    } catch {
    error = true;
    print(e.toString());
    }

  }

}



class ExampleWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

return ChangeNotifierProvider(
      builder: (context) => Model(),
child: Consumer<Model>(builder: (context, model, _) {
return FloatingActionButton(
  child: model.error ? Icon(Icons.error) : Icon(Icons.check),
  onPressed: () {
    model.func();
  }
);

    …