jQuery鼠标指针特效

RecyclerView 的学习记录

官方文档

**RecyclerView 样式与适配器等解耦 **:

通过设置不同的 LayoutManager , 就可以实现不同的 布局展示样式 ;
通过设置不同的 ItemDecoration , 可以实现不同的 间隔样式 ;
通过设置不同的 ItemAnimator , 可以实现不同的添加 删除动画 ;

以 " 设置不同的 LayoutManager , 就可以实现不同的布局展示样式 " 为例 , 如 :
设置 LinearLayoutManager 布局管理器 , RecyclerView 展示的就是 横向 / 纵向 的列表 ;
设置 GridLayoutManager 布局管理器 , RecyclerView 展示的就是 网格布局 ;
设置 StaggeredGridLayoutManager 布局管理器 , RecyclerView 展示的就是 瀑布流 样式的布局 ;

RecyclerView 简单使用

public class MainActivity3 extends AppCompatActivity {

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

        RecyclerView recyclerView = findViewById(R.id.recycler);

        //建立布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
        
        //瀑布流 交错网格布局管理器
        //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL);
        
        recyclerView.setLayoutManager(linearLayoutManager);

        //适配
        Adapter adapter = new Adapter();
        recyclerView.setAdapter(adapter);
    }


    /*
     * 自定义适配器
     * */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

        /**
         * 初始化布局文件
         *
         * @param parent
         * @param viewType
         * @return
         */
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.text_activity, parent, false);
            return new ViewHolder(root_view);
        }

        /**
         * 绑定数据
         *
         * @param holder
         * @param position
         */
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.item.setText("" + position);
        }

        @Override
        public int getItemCount() {
            return 7;
        }

        /**
         * 子布局容器
         */
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView item;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
            }
        }
    }
}

RecyclerView 设置不同的item界面效果

public class MainActivity3 extends AppCompatActivity {

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

        RecyclerView recyclerView = findViewById(R.id.recycler);

        //建立布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);

        //瀑布流 交错网格布局管理器
        //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL);

        recyclerView.setLayoutManager(linearLayoutManager);

        //适配
        Adapter adapter = new Adapter();
        recyclerView.setAdapter(adapter);
    }


    /*
     * 自定义适配器 --->RecyclerView.ViewHolder 多个item布局
     * */
    public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        public static final int ITEM_TYPE_1 = 0;
        public static final int ITEM_TYPE_2 = 1;

        /**
         * 初始化布局文件
         *
         * @param parent
         * @param viewType
         * @return
         */
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view;
            switch (viewType) {
                case ITEM_TYPE_1:
                    root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.text_activity, parent, false);
                    return new ViewHolder(root_view);
                case ITEM_TYPE_2:
                    root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.item_image, parent, false);
                    return new ViewHolder2(root_view);
            }
            return null;
        }

        /**
         * 绑定数据
         *
         * @param holder
         * @param position
         */
        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            switch (getItemViewType(position)) {
                case ITEM_TYPE_1:
                    ((ViewHolder) holder).item.setText("" + position);
                    break;
                case ITEM_TYPE_2:
                    ((ViewHolder2) holder).item.setText("" + position);
                    ((ViewHolder2) holder).image.setImageResource(R.mipmap.ic_launcher_round);
                    break;
            }
        }

        @Override
        public int getItemCount() {
            return 10;
        }

        @Override
        public int getItemViewType(int position) {
            return position % 2;
        }

        /**
         * 子布局容器
         */
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView item;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
            }
        }

        public class ViewHolder2 extends RecyclerView.ViewHolder {
            TextView item;
            ImageView image;

            public ViewHolder2(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
                image = itemView.findViewById(R.id.item_img);
            }
        }
    }
}

Item数据变化瀑布流

RecyclerView利用ItemTouchHelper 实现拖拽,左滑删除

public class MainActivity4 extends AppCompatActivity {

    /**
     * 数据源
     */
    private ArrayList<String> names = new ArrayList<String>();

    /**
     * 当前的 RecyclerView 列表
     */
    private RecyclerView recycler_view;

    /**
     * 布局管理器
     */
    private LinearLayoutManager layoutManager;

    /**
     * 适配器
     */
    private Adapter adapter;

    /**
     * 添加拖动处理
     */
    private ItemTouchHelper mItemTouchHelper;

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

        // 初始化数据
        initData();

        //1 . 从布局中获取 RecyclerView
        recycler_view = findViewById(R.id.recycler);

        //2 . 创建并设置布局管理器
        //创建布局管理器
        layoutManager = new LinearLayoutManager(
                this,
                RecyclerView.VERTICAL,
                false);

        //设置布局管理器
        recycler_view.setLayoutManager(layoutManager);

        // 设置边距
       // recycler_view.addItemDecoration(new ItemDecoration());

        //3 . 创建并设置列表适配器
        adapter = new Adapter();
        recycler_view.setAdapter(adapter);

        //4. 添加拖动事件
        WwtCallback callback = new WwtCallback(adapter);
        mItemTouchHelper = new ItemTouchHelper(callback);
        mItemTouchHelper.attachToRecyclerView(recycler_view);
    }


    /**
     * 初始化数据
     */
    private void initData(){
        names.add("宋江");
        names.add("卢俊义");
        names.add("吴用");
        names.add("公孙胜");
        names.add("关胜");
        names.add("林冲");
        names.add("秦明");
        names.add("呼延灼");
        names.add("花荣");
        names.add("柴进");
        names.add("李应");
        names.add("朱仝");
        names.add("鲁智深");
        names.add("武松");
        names.add("董平");
        names.add("张清");
        names.add("杨志");
        names.add("徐宁");
        names.add("索超");
    }

    /**
     * RecyclerView 适配器
     */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

        private RecyclerView mRecyclerView;

        @Override
        public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            this.mRecyclerView = recyclerView;
        }


        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity4.this).inflate(R.layout.text_activity, parent, false);
            return new ViewHolder(root_view);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.text.setText("" + names.get(position));
        }

        @Override
        public int getItemCount() {
            return names.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView text;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                text = itemView.findViewById(R.id.item);
            }
        }

        /**
         * 删除元素调用的方法
         * @param position
         */
        public void deleteItem(int position) {
            names.remove(position);
            notifyItemRemoved(position);
        }

        /**
         * 交换条目元素
         * @param srcPosition
         * @param dstPosition
         */
        public void changeItem(int srcPosition, int dstPosition) {
            // 交换集合中两个元素位置
            Collections.swap(names, srcPosition, dstPosition);
            // 刷新界面显示
            notifyItemMoved(srcPosition, dstPosition);
        }
    }
}

ItemTouchHelper.java

public class WwtCallback extends ItemTouchHelper.Callback {

    private static final String TAG = "Callback";

    private MainActivity4.Adapter mAdapter;

    public WwtCallback(MainActivity4.Adapter mAdapter) {
        this.mAdapter = mAdapter;
    }

    /**
     * 设置上下左右动作
     * 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView,
                                @NonNull RecyclerView.ViewHolder viewHolder) {
        // 设置拖动方向, 此处设置上下拖动事件
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        // 设置滑动方向, 此处设置左右侧滑事件
        int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        // 应用 拖动 和 滑动 设置
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    /*
        以下是拖动相关方法
     */

    /**
     * 是否启用长按拖动功能
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    /**
     * 拖动幅度设置
     * 组件在宽度 / 高度 上移动超过该比例 , 就认为拖动触发, 执行拖动相关操作
     * @param viewHolder
     * @return
     */
    @Override
    public float getMoveThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        // 该案例中, 拖动操作只能上下进行
        // 拖动超过条目组件高度超过 0.9 倍, 即可触发拖动操作
        return 0.9f;
    }

    /**
     * 监听滑动事件
     * 滑动分 水平 / 垂直 两个方向
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
                          @NonNull RecyclerView.ViewHolder viewHolder,
                          @NonNull RecyclerView.ViewHolder target) {
        // 拖动后交换数据, 该方法中交换 Adapter 中的数据, 并刷新界面
        Log.i(TAG, "触发拖动交换条目");
        mAdapter.changeItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    /*
        以下是滑动相关方法
     */

    /**
     * 是否启用滑动操作
     * @return 是否启用 true 启用, false 不启用
     */
    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    /**
     * 用户滑动距离, 设置的是比例值, 返回值为 0.5 , 就意味着滑动宽度/高度的一半, 才触发侧滑 onSwiped 方法
     * @param viewHolder
     * @return
     */
    @Override
    public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        return 0.5f;
    }

    /**
     * 滑动判定速度, 每秒移动的像素个数, 达到该速度后, 才可以被判定为滑动
     * @param defaultValue
     * @return
     */
    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
        return 5000f;
    }

    /**
     * 手指离开后的动画持续时间
     * @param recyclerView
     * @param animationType
     * @param animateDx
     * @param animateDy
     * @return
     */
    @Override
    public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
        return 200L;
    }

    /**
     * 滑动时的回调操作
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        Log.i(TAG, "触发侧滑删除条目");
        // 滑动指定的距离, 达到一定幅度后, 就会触发该方法回调
        // 这里做的是滑动删除功能, 直接删除滑动项
        // 该方法中删除指定条目, 并刷新界面
        mAdapter.deleteItem(viewHolder.getAdapterPosition());
    }
}

posted @ 2022-08-15 19:33  僵小七  阅读(29)  评论(0编辑  收藏  举报