2020-09-05

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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39094812/article/details/108425867