GVKun编程网logo

Android recyclerview滚动到顶部(android textview滚动)

16

在这篇文章中,我们将带领您了解Androidrecyclerview滚动到顶部的全貌,包括androidtextview滚动的相关情况。同时,我们还将为您介绍有关AndroidRecyclerView

在这篇文章中,我们将带领您了解Android recyclerview滚动到顶部的全貌,包括android textview滚动的相关情况。同时,我们还将为您介绍有关Android RecyclerView 快速平滑返回顶部、Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部、Android RecyclerView 滚动到中间位置、Android RecyclerView 滚动到中间位置的方法示例的知识,以帮助您更好地理解这个主题。

本文目录一览:

Android recyclerview滚动到顶部(android textview滚动)

Android recyclerview滚动到顶部(android textview滚动)

这是我的onCreate,它处理适配器,LinearLayoutManager等。我尝试了每个选项以尝试将其滚动到顶部,但不能。我什至尝试创建自己的自定义LinearLayoutManager。

//Reson for static to call from a static method to scroll it upprivate static RecyclerView taskRecyclerView;private FirebaseAdapter firebaseAdapter;private static LinearLayoutManager linearLayoutManager;@Overridepublic View onCreateView(LayoutInflater inflater, final ViewGroup container,                         Bundle savedInstanceState) {    // Inflate the layout for this fragment    final View view = inflater.inflate(R.layout.fragment_tasklist, container, false);    linearLayoutManager = new LinearLayoutManager(getActivity());    taskRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_mainTask);    databaseRef = FirebaseDatabase.getInstance().getReference().child(userAccount.getId());    firebaseAdapter = new FirebaseAdapter(TaskObject.class, R.layout.one_task, TaskViewHolder.class, databaseRef.child("Task"), getContext());    linearLayoutManager.setReverseLayout(true);    linearLayoutManager.setStackFromEnd(true);    linearLayoutManager.setSmoothScrollbarEnabled(true);    taskRecyclerView.setAdapter(firebaseAdapter);    taskRecyclerView.setLayoutManager(linearLayoutManager);    relativeLayoutAdd.setOnClickListener(this);    //Listen for any data change    databaseRef.child("Task").addListenerForSingleValueEvent(new ValueEventListener() {        @Override        public void onDataChange(DataSnapshot dataSnapshot) {            //onDataChange called so remove progress bar            //make a call to dataSnapshot.hasChildren() and based            //on returned value show/hide empty view            //use helper method to add an Observer to RecyclerView        }        @Override        public void onCancelled(DatabaseError databaseError) {        }    });    databaseRef.child("Task").keepSynced(true);    return view;}

答案1

小编典典

您尝试过taskRecyclerView.getLayoutManager().scrollToPosition(0)还是taskRecyclerView.scrollToPosition(your_position)

RecyclerView不会在其中实现任何滚动逻辑taskRecyclerView.scrollToPosition(your_position)taskRecyclerView.getLayoutManager().scrollToPosition(0)而是更加具体,它会根据实现的布局转到特定的索引,在您的情况下是线性的。

Android RecyclerView 快速平滑返回顶部

Android RecyclerView 快速平滑返回顶部

先看下实现的效果,没效果什么都白扯

 

下面直接上方法:

//目标项是否在最后一个可见项之后
  private boolean mShouldScroll;
  //记录目标项位置
  private int mToPosition;
  //目标项是否在最后一个可见项之后 private boolean mShouldScroll; //记录目标项位置 private int mToPosition;
  //滑动到指定位置
  private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) { // 第一个可见位置
      int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
      // 最后一个可见位置
      int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
      if (position < firstItem) {
          // 第一种可能:跳转位置在第一个可见位置之前
          mRecyclerView.smoothScrollToPosition(position);
      } else if (position <= lastItem) {
          // 第二种可能:跳转位置在第一个可见位置之后
          int movePosition = position - firstItem;
          if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
              int top = mRecyclerView.getChildAt(movePosition).getTop();
              mRecyclerView.smoothScrollBy(0, top);
          }
      } else {
          // 第三种可能:跳转位置在最后可见项之后
          mRecyclerView.smoothScrollToPosition(position);
          mToPosition = position;
          mShouldScroll = true;
      }
  }

使用方法

smoothMoveToPosition(rcv_activity_qz_info_list, 0);

在使用方法的时候判断下非空等操作,避免无用操作

 

Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部

Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部

志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

如果你有兴趣 你可以关注一下公众号 biglead 来获取最新的学习资料。

  • Flutter 从入门 到精通系列文章在这里

  • 系列学习教程在这里

在 Anddroid 中,RecyclerView 可以用来实现 列表 、九宫格、瀑布流效果。

本文章实现的效果,主要是 RecyclerView 滑动的代码分享

在这里插入图片描述

向下一个一个滑动

这里使用到的 phoneBeanList 是我 recyclerView 中显示的数据集合。


    /**
     * 向下一个一个滑动
     */
    private void scrollToNextFunction() {
        //获取当前显示的View 的数据
        int childCount = recyclerView.getChildCount();
        //获取最后一具 Item 对应的View
        View childAt = recyclerView.getChildAt(childCount - 1);
        //获取当前军舰中显示的最后一个 Item 的位置  Postion
        int childLayoutPosition = recyclerView.getChildLayoutPosition(childAt);
        //如果不是最后一个就向下滑动
        if(childLayoutPosition<phoneBeanList.size()-2){
            recyclerView.smoothScrollToPosition(childLayoutPosition+1);
        }else{
            Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
        }
    }

向上一个一个滑动


    /**
     * 向上一个一个滑动
     */
    private void scrollToTopFunction() {

        //获取当前视图中显示的第一个 Item 的位置 Position
        int childLayoutPosition = recyclerView.getChildLayoutPosition(recyclerView.getChildAt(0));
        if (childLayoutPosition > 0) {
            recyclerView.smoothScrollToPosition(childLayoutPosition - 1);
        } else {
            Toast.makeText(this, "已滑动到顶部了", Toast.LENGTH_LONG).show();
        }

    }

滑动到顶部 置顶

    /**
     * 滑动到顶部 置顶
     */
    private void scrollTopFunction() {
        recyclerView.smoothScrollToPosition(0);
    }

本文同步分享在 博客 “早起的年轻人”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

Android RecyclerView 滚动到中间位置

Android RecyclerView 滚动到中间位置

最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置。觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 android 控件的写的,应该是前端写的。于是,我想,能不能用 recyclerView 实现这个自动回滚到中间位置呢。

功夫不负有心人,查找了一些资料之后,终于搞定了。

下面由我细细讲来。

目标

点击某个条目,在经过4s无任何操作之后,该条目滚动到中间位置显示。点击后,用户在滑动,等用户不操作后再开始延时。用户多次点击,记最后一次点击位置。

分析

首先先考虑,滚动到指定位置是如何操作的?

// 滚动到指定位置
recyclerView.scrollToPosition(position);
 平滑滚动到指定位置
recyclerView.smoothScrollToPosition(position);

有没有滚动到制定像素位置呢?

 scrollBy(x,y)这个方法是自己去控制移动的距离,单位是像素,所以在使用scrollBy(x,y)需要自己去计算移动的高度或宽度。
recyclerView.scrollBy(x,y)

可是,问题是滚动到中间位置啊?这个怎么办呢?这样子行不行呢?

mRecyclerView.scrollToPosition(0);
mRecyclerView.scrollBy(0,400);

先滚动到制定位置,在滚动一段距离不就好了?运行发现,这两行代码只执行第一行,第二行无效。

debug 调试看了下,还是没有弄懂,实现太复杂。

那就是说这样是不行的,那有没有其他办法呢?

RecyclerView 有一个滚动监听方法:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView,int newState) {
                super.onScrollStateChanged(recyclerView,newState);
            }

            @Override
            void onScrolled(RecyclerView recyclerView,1)">int dx,1)"> dy) {
                .onScrolled(recyclerView,dx,dy);
            }
        });

onScrollStateChanged 方法对应三种状态:静止(SCROLL_STATE_IDLE),拖动滚动(SCROLL_STATE_DRAGGING),滑动(SCROLL_STATE_SETTLING)。
当手动缓慢滑动的时候,会触发:onScrollStateChanged (拖动滚动) --> (n个)onScrolled -->onScrollStateChanged(静止);

当手快速滑动的时候,会触发:onScrollStateChanged (拖动滚动) --> (n个)onScrolled --> onScrollStateChanged (滑动) -->

(n个)onScrolled --> onScrollStateChanged (静止);
有想法了,点击的时候,先运行 scrollToPosition,在 onScrolled 方法里面 运行 scrollBy 方法。写代码,运行,通过。
下面就是中间位置的计算了。

首先计算出 recylerview 的展现高度。

 Rect rect =  Rect();
 mRecyclerView.getGlobalVisibleRect(rect);
 reHeight = rect.bottom - rect.top - vHeight;

当运行 scrollToPosition 后,点击条目就会出现在视野当中,这时候,计算出相应的位移即可。需要注意一点的是,当点击条目在视野内的时候,是不会运行 scrollToPosition 方法的。

        int top = mRecyclerView.getChildAt(position - firstPosition).getTop();
int half = reHeight / 2;
        mRecyclerView.scrollBy(0,top - half);

最后就是延时的设定,采用Handler 进行延时。

代码

代码下载

核心代码如下:

class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private RecyclerView mRecyclerView;
     linearlayoutmanager mLayoutManager;
     RecyclerView.Adapter mAdapter;
     String[] data;
     Handler handler;
    boolean isClick = falseint vHeight = -1int reHeight = -1int position = 0final int target = 10boolean isMove =  Runnable runnable;

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

        handler =  Handler();

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        创建默认的线性LayoutManager
        mLayoutManager = new linearlayoutmanager(this);
        mLayoutManager.setAutoMeasureEnabled(true);
        mRecyclerView.setLayoutManager(mLayoutManager);
        如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize();
        mRecyclerView.setnestedScrollingEnabled();
        data = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21"};


       runnable =  Runnable() {
            @Override
             run() {
                if (isVisible()) {
                    scrollToMiddle();
                } else {
                    mRecyclerView.scrollToPosition(position);
                    isMove = ;
                    isClick = ;
                }
            }
        };

        mAdapter = new MyAdapter(data,1)"> MyAdapter.onRecyclerViewItemClick() {
            @Override
            void onItemClick(View v,1)"> pos) {
                Toast.makeText(MainActivity.this,"第" + pos + "行",Toast.LENGTH_SHORT).show();
                position = pos;
                vHeight = v.getHeight();

                Rect rect =  Rect();
                mRecyclerView.getGlobalVisibleRect(rect);
                reHeight = rect.bottom - rect.top - vHeight;

                 handler.removeCallbacksAndMessages(null);
                handler.removeCallbacks(runnable);
                handler.postDelayed(runnable,4000);
                isClick = ;

            }
        });
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.addOnScrollListener( newState);
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING && !isMove) {
                    handler.removeCallbacks(runnable);
                }
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                     (isClick) {
                        handler.postDelayed(runnable,1)">);
                    }
                }
            }

            @Override
             (isMove) {
                    if (vHeight < 0) {
                        isMove = ;
                        return;
                    }
                    scrollToMiddle();
                }
            }
        });
 scrollToMiddle() {
        int firstPosition = mLayoutManager.findFirstVisibleItemPosition();
         firstPosition).getTop();
        Log.d(TAG," position" + position + " " + top);
        ;
        mRecyclerView.scrollBy(0,top - half);
        isMove = ;

    }

    boolean isVisible() {
        int lastPosition = mLayoutManager.findLastVisibleItemPosition();
        return position <= lastPosition && position >= firstPosition;
    }

    @Override
     onDestroy() {
        .onDestroy();
        handler.removeCallbacksAndMessages(null);
        handler = ;
    }
}

 

第二种方法

可以直接采用 scrollToPositionWithOffset 方法。

if (mLayoutManager != null && mLayoutManager instanceof linearlayoutmanager) {
    ((linearlayoutmanager) mLayoutManager)
          .scrollToPositionWithOffset(position,half); 
}

scrollToPositionWithOffset 会直接把你想滚动的条目滚动到顶部,第二个参数是用来控制滚动的偏移量,距离顶部多少距离,这样的话,我们就不用写上面那么多代码啦。

 

总结

以上是小编为你收集整理的Android RecyclerView 滚动到中间位置全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Android RecyclerView 滚动到中间位置的方法示例

Android RecyclerView 滚动到中间位置的方法示例

最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置。觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 android 控件的写的,应该是前端写的。于是,我想,能不能用 recyclerView 实现这个自动回滚到中间位置呢。

功夫不负有心人,查找了一些资料之后,终于搞定了。

下面由我细细讲来。

目标

点击某个条目,在经过4s无任何操作之后,该条目滚动到中间位置显示。点击后,用户在滑动,等用户不操作后再开始延时。用户多次点击,记最后一次点击位置。

分析

首先先考虑,滚动到指定位置是如何操作的?

// 滚动到指定位置
recyclerView.scrollToPosition(position);
// 平滑滚动到指定位置
recyclerView.smoothScrollToPosition(position);

有没有滚动到制定像素位置呢?

// scrollBy(x,y)这个方法是自己去控制移动的距离,单位是像素,所以在使用scrollBy(x,y)需要自己去计算移动的高度或宽度。
recyclerView.scrollBy(x,y)

可是,问题是滚动到中间位置啊?这个怎么办呢?这样子行不行呢?

mRecyclerView.scrollToPosition(0);
mRecyclerView.scrollBy(0,400);

先滚动到制定位置,在滚动一段距离不就好了?运行发现,这两行代码只执行第一行,第二行无效。

debug 调试看了下,还是没有弄懂,实现太复杂。

那就是说这样是不行的,那有没有其他办法呢?

RecyclerView 有一个滚动监听方法:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView,int newState) {
        super.onScrollStateChanged(recyclerView,newState);
      }

      @Override
      public void onScrolled(RecyclerView recyclerView,int dx,int dy) {
        super.onScrolled(recyclerView,dx,dy);
      }
    });

onScrollStateChanged 方法对应三种状态:静止(SCROLL_STATE_IDLE),拖动滚动(SCROLL_STATE_DRAGGING),滑动(SCROLL_STATE_SETTLING)。

当手动缓慢滑动的时候,会触发: onScrollStateChanged (拖动滚动) --> (n个)onScrolled -->onScrollStateChanged(静止);

当手快速滑动的时候,会触发: onScrollStateChanged (拖动滚动) --> (n个)onScrolled --> onScrollStateChanged (滑动) -->

(n个)onScrolled --> onScrollStateChanged (静止);

有想法了,点击的时候,先运行 scrollToPosition,在 onScrolled 方法里面 运行 scrollBy 方法。写代码,运行,通过。

下面就是中间位置的计算了。

首先计算出 recylerview 的展现高度。

 Rect rect = new Rect();
 mRecyclerView.getGlobalVisibleRect(rect);
 reHeight = rect.bottom - rect.top - vHeight;
当运行 scrollToPosition 后,点击条目就会出现在视野当中,这时候,计算出相应的位移即可。需要注意一点的是,当点击条目在视野内的时候,是不会运行 scrollToPosition 方法的。

    int top = mRecyclerView.getChildAt(position - firstPosition).getTop();
int half = reHeight / 2;
    mRecyclerView.scrollBy(0,top - half);

最后就是延时的设定,采用Handler 进行延时。

代码

核心代码如下:

public class MainActivity extends AppCompatActivity {
  private static final String TAG = "MainActivity";
  private RecyclerView mRecyclerView;
  private linearlayoutmanager mLayoutManager;
  private RecyclerView.Adapter mAdapter;
  private String[] data;
  private Handler handler;
  private boolean isClick = false;
  private static int vHeight = -1;
  private static int reHeight = -1;
  private static int position = 0;
  private static final int target = 10;
  private static boolean isMove = false;
  private Runnable runnable;

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

    handler = new Handler();

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    //创建默认的线性LayoutManager
    mLayoutManager = new linearlayoutmanager(this);
    mLayoutManager.setAutoMeasureEnabled(true);
    mRecyclerView.setLayoutManager(mLayoutManager);
    //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setnestedScrollingEnabled(false);
    data = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21"};


    runnable = new Runnable() {
      @Override
      public void run() {
        if (isVisible()) {
          scrollToMiddle();
        } else {
          mRecyclerView.scrollToPosition(position);
          isMove = true;
          isClick = false;
        }
      }
    };

    mAdapter = new MyAdapter(data,new MyAdapter.onRecyclerViewItemClick() {
      @Override
      public void onItemClick(View v,int pos) {
        Toast.makeText(MainActivity.this,"第" + pos + "行",Toast.LENGTH_SHORT).show();
        position = pos;
        vHeight = v.getHeight();

        Rect rect = new Rect();
        mRecyclerView.getGlobalVisibleRect(rect);
        reHeight = rect.bottom - rect.top - vHeight;

        // handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
        handler.postDelayed(runnable,4000);
        isClick = true;

      }
    });
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView,newState);
        Log.d(TAG,"" + newState);
        if (newState == RecyclerView.SCROLL_STATE_DRAGGING && !isMove) {
          handler.removeCallbacks(runnable);
        }
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
          if (isClick) {
            handler.postDelayed(runnable,4000);
          }
        }
      }

      @Override
      public void onScrolled(RecyclerView recyclerView,dy);
        if (isMove) {
          if (vHeight < 0) {
            isMove = false;
            return;
          }
          scrollToMiddle();
        }
      }
    });
public void scrollToMiddle() {
    final int firstPosition = mLayoutManager.findFirstVisibleItemPosition();
    int top = mRecyclerView.getChildAt(position - firstPosition).getTop();
    Log.d(TAG," position" + position + " " + top);
    int half = reHeight / 2;
    mRecyclerView.scrollBy(0,top - half);
    isMove = false;

  }

  public boolean isVisible() {
    final int firstPosition = mLayoutManager.findFirstVisibleItemPosition();
    final int lastPosition = mLayoutManager.findLastVisibleItemPosition();
    return position <= lastPosition && position >= firstPosition;
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    handler.removeCallbacksAndMessages(null);
    handler = null;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • 浅谈Android RecyclerView UI的滚动控件示例
  • Android RecyclerView 实现快速滚动的示例代码
  • 功能强大的Android滚动控件RecyclerView
  • Android使用Recyclerview实现图片水平自动循环滚动效果
  • Android_RecyclerView实现上下滚动广告条实例(带图片)
  • Android中RecyclerView实现分页滚动的方法详解
  • Android RecyclerView滚动定位
  • Android使用RecyclerView实现水平滚动控件
  • Android代码实现AdapterViews和RecyclerView无限滚动

今天的关于Android recyclerview滚动到顶部android textview滚动的分享已经结束,谢谢您的关注,如果想了解更多关于Android RecyclerView 快速平滑返回顶部、Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部、Android RecyclerView 滚动到中间位置、Android RecyclerView 滚动到中间位置的方法示例的相关知识,请在本站进行查询。

本文标签: