RecyclerView 平滑滑动到指定位置

来源:互联网 发布:长沙源码信息骗局 编辑:程序博客网 时间:2024/05/05 16:27
public class MainActivity extends AppCompatActivity implements RecyclerAdapter.OnItemClickListener {    private RecyclerView mRecyclerView;    private RecyclerAdapter mAdapter;    private LinearLayoutManager mLinearLayoutManager;    private RadioGroup mRadioGroup;    private EditText mEditText;    private boolean move = false;    private int mIndex = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        setAdapter();        initEvent();    }    private void initView() {        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);        mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);        mEditText = (EditText) findViewById(R.id.editText);    }    private void setAdapter() {        mLinearLayoutManager = new LinearLayoutManager(this);        mAdapter = new RecyclerAdapter();        mRecyclerView.setLayoutManager(mLinearLayoutManager);        mRecyclerView.setAdapter(mAdapter);    }    private void initEvent() {        mAdapter.addOnItemClickListener(this);        mRecyclerView.addOnScrollListener(new RecyclerViewListener());    }    @Override    public void onItemClick(View view,int position) {        move(position);    }    public void go(View view){        String str = mEditText.getText().toString();        if (str.equals("")){            Toast.makeText(this,"输入数字",Toast.LENGTH_SHORT).show();            return;        }        int n = Integer.valueOf(str);        move(n);    }    private void move(int n){        if (n<0 || n>=mAdapter.getItemCount() ){            Toast.makeText(this,"超出范围了",Toast.LENGTH_SHORT).show();            return;        }        mIndex = n;        mRecyclerView.stopScroll();        switch (mRadioGroup.getCheckedRadioButtonId()){            case R.id.scroll:                moveToPosition(n);                break;            case R.id.smoothScroll:                smoothMoveToPosition(n);                break;        }    }    private void smoothMoveToPosition(int n) {        int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();        int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();        if (n <= firstItem ){            mRecyclerView.smoothScrollToPosition(n);        }else if ( n <= lastItem ){            int top = mRecyclerView.getChildAt(n - firstItem).getTop();            mRecyclerView.smoothScrollBy(0, top);        }else{            mRecyclerView.smoothScrollToPosition(n);            move = true;        }    }    private void moveToPosition(int n) {        int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();        int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();        if (n <= firstItem ){            mRecyclerView.scrollToPosition(n);        }else if ( n <= lastItem ){            int top = mRecyclerView.getChildAt(n - firstItem).getTop();            mRecyclerView.scrollBy(0, top);        }else{            mRecyclerView.scrollToPosition(n);            move = true;        }    }    class RecyclerViewListener extends RecyclerView.OnScrollListener{        @Override        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {            super.onScrollStateChanged(recyclerView, newState);            if (move && newState == RecyclerView.SCROLL_STATE_IDLE && mRadioGroup.getCheckedRadioButtonId() == R.id.smoothScroll){                move = false;                int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();                if ( 0 <= n && n < mRecyclerView.getChildCount()){                    int top = mRecyclerView.getChildAt(n).getTop();                    mRecyclerView.smoothScrollBy(0, top);                }            }        }        @Override        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {            super.onScrolled(recyclerView, dx, dy);            if (move && mRadioGroup.getCheckedRadioButtonId() == R.id.scroll){                move = false;                int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();                if ( 0 <= n && n < mRecyclerView.getChildCount()){                    int top = mRecyclerView.getChildAt(n).getTop();                    mRecyclerView.scrollBy(0, top);                }            }        }    }
0 0
原创粉丝点击