package com.mjj.recyclerviewlocation;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
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);
}
}
}
}
}