ListView和RecyclerView点击返回顶部

先说ListView,很简答,废话就不多说了,直接上代码。

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bwie.listviewscroll.MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>
    <Button
        android:id="@+id/btn"
        android:text="顶部"
        android:textSize="25sp"
        android:visibility="gone"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Activity:
public class MainActivity extends AppCompatActivity {

    private ListView mLv;
    private Button mBtn;

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

    }

    private void initData() {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 80; i++) {
            list.add("条目" + i);
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
        mLv.setAdapter(adapter);
        mLv.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {

            }

            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem>=2){
                    mBtn.setVisibility(View.VISIBLE);
                }else {
                    mBtn.setVisibility(View.GONE);
                }
            }
        });
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (Build.VERSION.SDK_INT>=8){
                    mLv.smoothScrollToPosition(0);//返回顶部由滑动效果
                }else {
                    mLv.setSelection(0);//直接返回顶部
                }
            }
        });
    }

    private void initView() {
        mLv = (ListView) findViewById(R.id.lv);
        mBtn = (Button) findViewById(R.id.btn);
    }
}

OK!

接下来是RecyclerView。

先说怎么点击返回顶部,再讲每个参数的含义。

自条目的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv_title"
        android:textSize="25sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

适配器:
public class MyAdapter extends XRecyclerView.Adapter<XRecyclerView.ViewHolder> {
    Context context;
    List<String> list;

    public MyAdapter(Context context, List<String> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public XRecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=View.inflate(context,R.layout.layout_item,null);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(XRecyclerView.ViewHolder holder, int position) {
        ((MyViewHolder)holder).tv_title.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list!=null?list.size():0;
    }

    private static class MyViewHolder extends XRecyclerView.ViewHolder{
        TextView tv_title;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_title=itemView.findViewById(R.id.tv_title);
        }
    }
}

Main布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bwie.listviewscroll.MainActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/xrv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </com.jcodecraeer.xrecyclerview.XRecyclerView>
    <Button
        android:id="@+id/btn"
        android:text="顶部"
        android:textSize="25sp"
        android:visibility="gone"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

MainActivity:
public class MainActivity extends AppCompatActivity {


    private XRecyclerView mXrv;
    private Button mBtn;

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

    private void initData() {
        List<String> list=new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add("条目"+i);
        }
        LinearLayoutManager manager=new LinearLayoutManager(this);
        mXrv.setLayoutManager(manager);
        MyAdapter adapter=new MyAdapter(this,list);
        mXrv.setAdapter(adapter);
        mXrv.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);
                LinearLayoutManager layoutManager = (LinearLayoutManager) mXrv.getLayoutManager();
                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();//屏幕上显示的第一个条目,从1开始计数
                int itemCount = layoutManager.getItemCount();//数据的总数
                int childCount = layoutManager.getChildCount();//当前屏幕显示的个数
                Log.i("-----------------", "onScrolled: "+firstVisibleItemPosition+"------"+itemCount+"----"+childCount);
                if (firstVisibleItemPosition>1){
                    mBtn.setVisibility(View.VISIBLE);
                }else {
                    mBtn.setVisibility(View.GONE);
                }
            }
        });

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (Build.VERSION.SDK_INT>=8){
                    mXrv.smoothScrollToPosition(0);//返回顶部由滑动效果
                }
            }
        });
    }
    private void initView() {
        mXrv = (XRecyclerView) findViewById(R.id.xrv);
        mBtn = (Button) findViewById(R.id.btn);
    }
}
运行一下效果就出来了。

   接下来就介绍一下RecyclerView的addOnScrollListener滑动事件:

有两个回调方法

        void onScrollStateChanged(RecyclerView recyclerView, int newState): 滚动状态变化时回调
        void onScrolled(RecyclerView recyclerView, int dx, int dy): 滚动时回调

1.onScrollStateChanged(RecyclerView recyclerView, int newState)方法

回调的两个变量的含义:
recyclerView: 当前在滚动的RecyclerView
newState: 当前滚动状态.

        其中newState有三种值:
     *//**
     * The RecyclerView is not currently scrolling.(静止没有滚动)
     *//*
    public static final int SCROLL_STATE_IDLE = 0;

     *//**
     * The RecyclerView is currently being dragged by outside input such as user touch input.
     *(正在被外部拖拽,一般为用户正在用手指滚动)
     *//*
    public static final int SCROLL_STATE_DRAGGING = 1;

     *//**
     * The RecyclerView is currently animating to a final position while not under outside control.
     *(自动滚动)
     *//*
    public static final int SCROLL_STATE_SETTLING = 2;


2.onScrolled(RecyclerView recyclerView, int dx, int dy)方法
回调的三个变量含义:
recyclerView : 当前滚动的view
dx : 水平滚动距离
dy : 垂直滚动距离

dx > 0 时为手指向左滚动,列表滚动显示右面的内容
dx < 0 时为手指向右滚动,列表滚动显示左面的内容
dy > 0 时为手指向上滚动,列表滚动显示下面的内容
dy < 0 时为手指向下滚动,列表滚动显示上面的内容

3.canScrollVertically和canScrollHorizontally方法
  public boolean canScrollVertically (int direction)
    这个方法是判断View在竖直方向是否还能向上,向下滑动。
    其中,direction为 -1 表示手指向下滑动(屏幕向上滑动), 1 表示手指向上滑动(屏幕向下滑动)。

    public boolean canScrollHorizontally (int direction)
    这个方法用来判断 水平方向的滑动

    例如:
        mXrv.canScrollVertically(1)的值表示是否能向下滚动,false表示已经滚动到底部
       mXrv.canScrollVertically(-1)的值表示是否能向上滚动,false表示已经滚动到顶部


猜你喜欢

转载自blog.csdn.net/qq_40441190/article/details/78624277