recyclerview停止时滚动到指定位置,三个类
1.简单的activity,为了展示
package com.wangbosen.demolink.starAnimation;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SnapHelper;
import android.os.Bundle;
import android.view.View;
import com.wangbosen.demolink.R;
import com.wangbosen.demolink.starAnimation.view.MyRecView;
public class RecActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rec);
MyRecView recyclerView = findViewById(R.id.listview);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter adapter = new MyAdapter(this);
recyclerView.setAdapter(adapter);
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
}
}
2.一个adapter
package com.wangbosen.demolink.starAnimation;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.wangbosen.demolink.R;
public class MyAdapter extends RecyclerView.Adapter {
public static final int Image = 1;
public static final int Text = 2;
private Context context;
public MyAdapter(Context ctx) {
context = ctx;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == Image) {
View view = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);
return new ImageViewHolder(view);
} else {
View view = LayoutInflater.from(context).inflate(R.layout.item_text, parent, false);
return new TextViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == 1) {
ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
imageViewHolder.imageView.setImageResource(R.mipmap.ic_launcher);
} else {
TextViewHolder imageViewHolder = (TextViewHolder) holder;
imageViewHolder.imageView.setText("测试数据:" + position);
}
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return Image;
} else {
return Text;
}
}
@Override
public int getItemCount() {
return 5;
}
class ImageViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageview);
}
}
class TextViewHolder extends RecyclerView.ViewHolder {
TextView imageView;
public TextViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.textview);
}
}
}
3.一个自定义的recyclerview,为了处理停止时,判断当前界面的内容是否有第一个条目显示,如果有,则滚动到第一个条目
package com.wangbosen.demolink.starAnimation.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
public class MyRecView extends RecyclerView {
public MyRecView(@NonNull Context context) {
super(context);
}
public MyRecView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyRecView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
mHandler.sendEmptyMessageDelayed(0, 10);
break;
}
return super.onTouchEvent(ev);
}
// 用于 存储 上一次 滚动的Y坐标
private int lastY = -1;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
// 打印 每次 Y坐标 滚动的距离 // LogUtils.e(scrollView.getScrollY() + "");
// 获取到 滚动的 Y 坐标距离
int scrollY = getScrollY();
// 如果 滚动 的Y 坐标 的 最后一次 滚动到的Y坐标 一致说明 滚动已经完成
if (scrollY == lastY) {
// ScrollView滚动完成 处理相应的事件
if (firstViewIsImage()) {
smoothScrollToPosition(0);
}
} else {
// 滚动的距离 和 之前的不相等 那么 再发送消息 判断一次
// 将滚动的 Y 坐标距离 赋值给
lastY = scrollY;
mHandler.sendEmptyMessageDelayed(0, 10);
}
}
}
};
private boolean firstViewIsImage() {
View view = getChildAt(0);
if (view instanceof ViewGroup && ((ViewGroup)view).getChildAt(0) instanceof ImageView) {
return true;
} else {
return false;
}
}
}