您的位置:首页 > 其它

ListView和RecyclerView点击返回顶部

2017-11-24 14:25 357 查看
先说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表示已经滚动到顶部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐