RecyclerView入门

RecyclerView的简单用法 阅读详情

RecyclerView 可以让您轻松高效地显示大量列表数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。
当列表项滚动出屏幕时,RecyclerView不会销毁其视图,而是会被回收,对屏幕上滚动的新列表项重用该视图。RecyclerView可以让您轻松高效地显示大量数据。 可提升性能和应用的响应能力,并降低功耗。

一、简单使用

1. fragment_module.xml
在页面中添加一个RecyclerView布局,并将RecyclerView布局设置为线性布局、垂直分布、从上到下排列。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

		<androidx.recyclerview.widget.RecyclerView
			android:id="@+id/rv_module"
			android:layout_width="match_parent"
			android:layout_height="0dp"
			android:layout_weight="1"
			android:orientation="vertical"
			app:layoutManager="LinearLayoutManager"
			app:reverseLayout="false" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

效果图

2. item_module.xml
定义列表项的外观

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="data"
            type="com.example.myapplication.bean.ModuleBean" />
    </data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="140dp">

        <View
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="16dp"
            android:layout_marginBottom="8dp"
            android:background="@drawable/shape_module_bg" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text='@{data.name, default="一个模块名"}' />

        <TextView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_gravity="top|end"
            android:layout_marginEnd="8dp"
            android:background="@drawable/shape_circle_tip"
            android:gravity="center"
            android:text='@{data.num+"", default=99}'
            android:textColor="@color/white" />
    </FrameLayout>
</layout>

效果图
3. ModuleRecyclerViewHolder.java
定义一个 ViewHolder ,用于存储列表项的一个布局实例。
我们可以在 ViewHolder 自由编写操作布局实例的函数,用于将数据渲染到布局上,例如 setStatus 函数。

public class ModuleRecyclerViewHolder extends RecyclerView.ViewHolder {
    private final ItemModuleBinding binding;

    public ModuleRecyclerViewHolder(@NonNull ItemModuleBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public ItemModuleBinding getBinding() {
        return binding;
    }

    public void setStatus(int status) {
        switch (status) {
            case 0:
                binding.tvStatus.setTextColor(ContextCompat.getColor(Utils.getContext(), R.color.primary));
                binding.tvStatus.setBackgroundResource(R.color.primary_secondary);
                binding.tvStatus.setText("待完成");
                break;
            case 1:
                binding.tvStatus.setTextColor(ContextCompat.getColor(Utils.getContext(), R.color.error));
                binding.tvStatus.setBackgroundResource(R.color.error_secondary);
                binding.tvStatus.setText("未通过");
                break;
            case 2:
                binding.tvStatus.setTextColor(ContextCompat.getColor(Utils.getContext(), R.color.info));
                binding.tvStatus.setBackgroundResource(R.color.info_secondary);
                binding.tvStatus.setText("已完成");
                break;
        }
    }
}

4. ModuleRecyclerViewAdapter.java
定义一个 Adapter ,接收需要渲染的数据列表,重写 onCreateViewHolder 、 onBindViewHolder 、 getItemCount 。

public class ModuleRecyclerViewAdapter extends RecyclerView.Adapter<ModuleRecyclerViewHolder> {
    List<ModuleBean> moduleBeans;

    public ModuleRecyclerViewAdapter(List<ModuleBean> moduleBeans) {
        this.moduleBeans = moduleBeans;
    }
	// 刷新数据
    public void setModuleBeans(List<ModuleBean> newList) {
        final List<TaskResponse> oldList = new ArrayList<>(tasklist);

        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                return oldList.size();
            }

            @Override
            public int getNewListSize() {
                return newList.size();
            }

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                return oldList.get(oldItemPosition).getId()
                        .equals(newList.get(newItemPosition).getId());
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
                return oldList.get(oldItemPosition).equals(newList.get(newItemPosition));
            }
        });

        // 更新数据
        moduleBeans.clear();
        moduleBeans.addAll(newList);

        // 只更新变化的部分,避免 notifyDataSetChanged()
        diffResult.dispatchUpdatesTo(this);
    }
	// 增加数据,数据分页加载更多数据时使用
    public void addModuleBeans(List<ModuleBean> newList) {
        int positionStart = moduleBeans.size();
        int itemCount = data.size();
        moduleBeans.addAll(newList);
        notifyItemRangeChanged(positionStart, itemCount);
    }

    @NonNull
    @Override
    public ModuleRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater from = LayoutInflater.from(parent.getContext());
        ItemModuleBinding inflate = ItemModuleBinding.inflate(from, parent, false);
        return new ModuleRecyclerViewHolder(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull ModuleRecyclerViewHolder holder, int position) {
        ModuleBean moduleBean = moduleBeans.get(position);
        holder.getBinding().setData(moduleBean);
        holder.setStatus(moduleBean.getStatus());
    }

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

5. DividerItemDecoration
通过 ItemDecoration 可以为 RecyclerView 的每一项添加间距和填充装饰。
在 getItemOffsets 函数中可以为每个子项设置上下左右的间距,类似于 padding 。如果 A 项的 bottom = 20,B 项的 top = 20,最终 A 和 B 之间的间隔就是 40(20+20)。
在 onDraw 函数中可以添加图片,绘制线条、矩形、圆形、扇形等图形,图形会显示在每个子项的下方,会在下一个子项绘制前绘制(如果没有下一项则不会绘制)。如果没有设置间隔,图形会与下一个子项重叠。

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private int space = 0;

    private final Drawable divider;

    public DividerItemDecoration(Context context) {
        divider = ContextCompat.getDrawable(context, R.drawable.shape_divider); // 获取分隔线Drawable
        assert divider != null;
        space = divider.getIntrinsicHeight();
    }

    // 设置间隔
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        // 为每个子项设置上下左右的间距
        if(parent.getChildAdapterPosition(view)==0){
            outRect.set(0,0,0,0);
        }else{
            outRect.set(0,space,0,0);
        }
    }

    // 填充装饰
    @Override
    public void onDraw(@NonNull Canvas c, RecyclerView parent, @NonNull RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        for (int i = 0; i < parent.getChildCount() - 1; i++) {
            View child = parent.getChildAt(i);
            int top = child.getBottom();
            int bottom = top + space;
            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
        android:width="20dp"
        android:height="20dp" />
    <solid android:color="@color/black"/>
</shape>

6. translate_module_item.xml 设置动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <translate
        android:fromXDelta="100%"
        android:toXDelta="0%" />
</set>

7. ModuleActivity.java

public class ModuleFragment extends BaseFragment<ModuleViewModel, FragmentModuleBinding> {

    private ModuleRecyclerViewAdapter adapter;

	// ViewModel
    @Override
    protected ModuleViewModel createViewModel() {
        return new ViewModelProvider(this).get(ModuleViewModel.class);
    }

	// DataBinding
    @Override
    protected FragmentModuleBinding createDataBinding(LayoutInflater inflater, ViewGroup container) {
        return FragmentModuleBinding.inflate(inflater, container, false);
    }

    @Override
    protected void initView() {
        adapter = new ModuleRecyclerViewAdapter(viewModel.modules.getValue());
        binding.rvModule.setAdapter(adapter);
        // 设置装饰
        binding.rvModule.addItemDecoration(new DividerItemDecoration(getContext()));
        // 设置平移动画
        Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.translate_module_item);
        binding.rvModule.setAnimation(animation);
    }

    @Override
    protected void initData() {
        viewModel.modules.observe(this, new Observer<List<ModuleBean>>() {
            @Override
            public void onChanged(List<ModuleBean> moduleBeans) {
                adapter.setModuleBeans(moduleBeans);
            }
        });
    }
}

在这里插入图片描述

二、基本介绍

RecyclerView 布局灵活,功能很多。

  • 排列方式:线性列表、表格还有瀑布流布局
  • 布局方向:垂直方向、水平方向
  • 布局反转:垂直方向默认从上往下排列,反转后从下往上排列;水平方向默认从左往右排列,反转后从右往左排列
  • 滚动条:设置滚动条和滚动槽
  • 间隔装饰:设置子项之间的间隔距离和图片
  • 动画:支持添加、删除、移动动画

1. 实现步骤

  1. 确定是线性布局还是网格布局
  2. 设计列表项中每个元素的外观和行为
  3. 扩展ViewHolder,定义列表项的所有功能
  4. 定义Adapter,将数据与ViewHolder绑定

2. 关键类

  • RecyclerView: RecyclerView 是一个 ViewGroup。因此,将 RecyclerView 添加到布局中的方式与添加任何其他界面元素相同。
  • RecyclerView.Adapter: Adapter 会根据需要创建 ViewHolder 对象,将视图与其数据相关联。
    • onCreateViewHolder() 每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。
    • onBindViewHolder() RecyclerView 调用此方法将 ViewHolder 与数据相关联。此方法会提取适当的数据,并使用该数据填充 ViewHolder 的布局。例如,如果 RecyclerView 显示的是一个名称列表,该方法可能会在列表中查找适当的名称,并填充 ViewHolder 的 TextView widget。
    • getItemCount()RecyclerView 调用此方法来获取数据集的大小。例如,在通讯簿应用中,这可能是地址总数。RecyclerView 使用此方法来确定什么时候没有更多的列表项可以显示。
  • RecyclerView.ViewHolder: ViewHolder 是包含列表中各列表项的布局的 View 的封装容器。ViewHolder创建时,没有任何与之关联的数据。ViewHolder创建后,RecyclerView会将其“绑定”到其数据上。
  • RecyclerView.LayoutManager: 布局管理器负责排列列表中的各个元素。你可以使用 RecyclerView 库提供的布局管理器之一,也可以自定义布局管理器。所有布局管理器都基于该库的 LayoutManager 抽象类。
    • LinearLayoutManager: 线性布局
    • GridLayoutManager: 网格布局
    • StaggeredGridLayoutManager: 瀑布流布局
    • 自定义布局管理器
  • RecyclerView.ItemDecoration : ItemDecoration 允许应用程序从适配器的数据集向特定 item 视图添加特殊的绘图和布局偏移量。这对于在项目之间绘制分隔线、高亮显示、视觉分组边界等非常有用。

三、常用的属性和方法

1. 样式相关

在RecyclerView布局中用到的属性

    <declare-styleable name="RecyclerView">
        <!-- Class name of the Layout Manager to be used.
        <p/>
        The class must ext androidx.recyclerview.widget.RecyclerViewView$LayoutManager
        and have either a default constructor or constructor with the signature
        (android.content.Context, android.util.AttributeSet, int, int).
         <p/>
         If the name starts with a '.', application package is prefixed.
         Else, if the name contains a '.', the classname is assumed to be a full class name.
         Else, the recycler view package naandroidx.appcompat.widgetdget) is prefixed. -->
        <attr format="string" name="layoutManager"/>

        <!-- ============================= -->
        <!-- Attributes for Layout Manager -->
        <!-- ============================= -->
        <eat-comment/>

        <attr name="android:orientation"/>
        <attr name="android:descendantFocusability"/>
        <attr name="android:clipToPadding"/>
        <attr format="integer" name="spanCount"/>
        <attr format="boolean" name="reverseLayout"/>
        <attr format="boolean" name="stackFromEnd"/>
        <attr format="boolean" name="fastScrollEnabled"/>
        <attr format="reference" name="fastScrollVerticalThumbDrawable"/>
        <attr format="reference" name="fastScrollVerticalTrackDrawable"/>
        <attr format="reference" name="fastScrollHorizontalThumbDrawable"/>
        <attr format="reference" name="fastScrollHorizontalTrackDrawable"/>
    </declare-styleable>

2. RecyclerView

  • 布局管理器相关
    • setLayoutManager(LayoutManager manager):设置布局管理器,用于控制子视图的排列方式。常见的有 LinearLayoutManager(线性布局)、GridLayoutManager(网格布局)和 StaggeredGridLayoutManager(交错网格布局)。
  • 数据适配器相关*
    • setAdapter(Adapter adapter):为 RecyclerView 设置适配器,负责提供数据并绑定到视图上。
    • swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews):替换当前适配器,并决定是否移除并回收现有的视图。
  • 视图缓存相关
    • setItemViewCacheSize(int size):设置 RecyclerView 应该缓存的额外视图数量,这些视图缓存可以在用户滚动时快速重用。
    • setRecycledViewPool(RecyclerView.RecycledViewPool pool):设置共享的视图池,这对于嵌套的 RecyclerView 特别有用。
    • getRecycledViewPool():获取当前使用的视图池。
    • setHasFixedSize(boolean hasFixedSize):如果可以确定 RecyclerView 的大小不会因为内容的变化而变化,则可以设置此属性为 true 来优化性能。
  • 滚动与动画相关
    • scrollToPosition(int position):滚动到指定位置。
    • smoothScrollToPosition(int position):平滑滚动到指定位置。
    • setItemAnimator(ItemAnimator animator):设置项目添加、删除等操作的动画效果,默认使用 DefaultItemAnimator。
    • setItemAnimator(null):禁用默认动画。
  • 分割线与装饰
    • addItemDecoration(ItemDecoration decor):添加分割线或其他装饰。
    • removeItemDecoration(ItemDecoration decor):移除之前添加的装饰。
  • 其他常用方法
    • addOnScrollListener(OnScrollListener listener):添加滚动监听器,用于检测滚动事件。
    • addOnItemTouchListener(OnItemTouchListener listener):添加触摸事件监听器,可用于实现点击或长按等功能。
    • findViewHolderForAdapterPosition(int position):根据适配器中的位置找到对应的 ViewHolder。
    • getAdapter():获取当前设置的 Adapter。
    • setLayoutFrozen(boolean freeze):冻结布局更新,适用于需要暂停 UI 更新的情况。
    • setNestedScrollingEnabled(boolean enabled):启用或禁用嵌套滚动。
    • setOverScrollMode(int mode):它属于View类的一个方法,设置视图到达边界时的过度模式(none, ifContentScrolls, always)。
    • setClipToPadding(boolean clipToPadding):是否裁剪到填充边界,默认是 true。

3. RecyclerView.Adapter

  • 可以重写的函数
    • onCreateViewHolder(ViewGroup parent, int viewType):这是适配器中必须实现的方法之一,当需要一个新的 ViewHolder 来展示某个类型的条目时会调用此方法。在这里你应该创建并返回一个新的 ViewHolder 实例。
    • onBindViewHolder(ViewHolder holder, int position):这也是一个必需实现的方法,用于将数据绑定到特定位置的 ViewHolder 上。当你需要显示或更新某个条目的时候,这个方法会被调用。
    • getItemCount():返回数据集中条目的总数。RecyclerView 使用这个值来确定有多少个条目需要被展示。
    • getItemViewType(int position):根据条目的位置获取其类型。这对于支持多种不同类型的条目布局非常有用。
    • onViewRecycled(ViewHolder holder):当一个 ViewHolder 被回收且不再使用时调用。可以用来释放资源或者取消网络请求等操作。
    • onViewAttachedToWindow(ViewHolder holder) 和 onViewDetachedFromWindow(ViewHolder holder):这两个方法分别在 ViewHolder 被附加到窗口(即将显示)和从窗口分离(即将隐藏)时调用。
    • onAttachedToRecyclerView(RecyclerView recyclerView):当 Adapter 被附加到 RecyclerView 时调用。可以在此初始化与 RecyclerView 相关的操作。
    • onDetachedFromRecyclerView(RecyclerView recyclerView):当 Adapter 从 RecyclerView 分离时调用。通常用于清理资源。
  • 数据操作相关方法
    • getItemCount():返回数据集中的条目总数。RecyclerView 使用这个方法来确定有多少个条目需要展示。
    • notifyDataSetChanged():通知适配器数据集发生了变化,这会导致整个列表重新绘制。
    • notifyItemChanged(int position):通知适配器特定位置的数据已经改变,导致该位置的视图更新。
    • notifyItemInserted(int position):通知适配器在特定位置插入了一个新条目。
    • notifyItemRemoved(int position):通知适配器从特定位置移除了一个条目。
    • notifyItemRangeChanged(int positionStart, int itemCount):通知适配器从 positionStart 开始的 itemCount 个条目已更改。
    • notifyItemRangeInserted(int positionStart, int itemCount):通知适配器从 positionStart 开始插入了 itemCount 个条目。
    • notifyItemRangeRemoved(int positionStart, int itemCount):通知适配器从 positionStart 开始移除了 itemCount 个条目。
  • 视图类型管理
    • getItemViewType(int position):返回给定位置条目的视图类型。如果您的列表中有多种类型的条目,您可以通过重写此方法来区分它们。
  • 其他方法
    • setHasStableIds(boolean hasStableIds):设置是否应该使用稳定的 ID。稳定 ID 可以提高性能,特别是在动画方面。
    • getItemId(int position):返回指定位置条目的 ID。只有在设置了稳定 ID 后才需要实现此方法。

4. RecyclerView.ViewHolder

  • 公共函数
    • getAdapterPosition():返回该 ViewHolder 在 Adapter 数据集中的位置。如果该 ViewHolder 当前未绑定到任何数据项,则返回 RecyclerView.NO_POSITION。
    • getAbsoluteAdapterPosition():返回 ViewHolder 在整个 Adapter 中的绝对位置(包括 Header、Footer 等)。如果无法确定绝对位置,则返回 RecyclerView.NO_POSITION 。
    • getLayoutPosition():返回该 ViewHolder 在布局中的位置。如果发生了动画或布局变动,可能与 getAdapterPosition() 返回的值不同。
    • getOldPosition():返回在最近一次布局之前 ViewHolder 所在的位置。这在处理动画时可能会有用。
    • isRecyclable() 和 setIsRecyclable(boolean recyclable):判断 ViewHolder 是否可被回收,并允许设置是否可以回收。当需要暂时阻止 ViewHolder 被回收时,可以使用此方法。
    • isInvalid():检查 ViewHolder 是否已经无效,即它不再对应于任何数据项。
    • isBound():检查 ViewHolder 是否已经绑定了数据。注意,这是一个包私有的方法,通常不会直接使用。
  • 公共属性
    • itemView:这是 ViewHolder 的一个公开字段,代表当前条目的根视图。通过这个字段可以直接访问条目的顶层视图。
  • 其他函数
    • findViewHolderForAdapterPosition(int position) 和 findViewHolderForLayoutPosition(int position):这两个方法是 RecyclerView 提供的静态方法,用于根据 Adapter 或 Layout 位置获取相应的 ViewHolder 实例 。

5. RecyclerView.ItemDecoration

  • 可以重写的函数
    • getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state):该方法用于设置每个项的外边距(如分隔线的间距)。outRect 传递的是矩形,用来定义左、上、右、下的间距。
    • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state):用于绘制每个子项的装饰,比如分隔线或自定义的图形。
    • onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state):在所有子项绘制之后调用,可以用来绘制覆盖在子项之上的装饰。
  • 其他方法
    • setDrawable(Drawable drawable):如果装饰需要使用 Drawable 来绘制某种图形或分隔线,可以通过该方法来设置。
    • setSpacing(int space):有时我们会为子项设置固定的间距,可以使用此方法来调整 ItemDecoration 的间距。
    • setPadding(int left, int top, int right, int bottom):用于设置每个项的内边距。

未完待续……

Android RecyclerView使用详解(含通过网络请求得到数据) RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。对于RecyclerView的使用根据实际项目进行说明,一些功能可能是你现在正在做的,对你有帮助也说不定。 阅读详情

相关推荐

RecycleView的基本使用

前言 为了解决 ListView 存在的拓展性差、需要手动优化性能等问题,Android 提供了滚动组件 RecycleView。本篇博客用于梳理 RecycleView 的使用方法。 RecycleView 的优点 RecycleView 仅会处理当前现实在屏幕上的项。假如列表中有 1000个元素,而页面只显示其中 10 个,那么 RecycleView 仅处理这 10 个项 当某个项滚出屏幕时,RecycleView 会回收其视图。这个项被回收,用于填充新进入屏幕的内容。 当某一项发生变化时,仅重新绘

jiaweilovemingming的博客 3130

RecyclerView详解

RecyclerView 简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分。 RV 常规使用方式如下: 解释说明。 setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGr

Android 4万+

第8章 RecyclerView入门

作者:禅与计算机程序设计艺术 1.背景介绍 RecyclerView(Recycler View) 是一种适用于滚动列表场景的视图容器。它支持不同的布局,可以进行水平或垂直方向上的滚动,还可实现局部刷新、加载更多等功能。它的出现主要是为了解决RecyclerView组件的一些缺点,比如性能不够快,扩

AI天才研究院 730

Android基础——RecyclerView

RecycleViewRecycleView是什么?RecycleView使用三级目录 RecycleView是什么? RecycleView是进阶版的ListView,不仅可以实现ListView的纵向滑动,还可以横向滑动和瀑布流滑动。 RecycleView使用 使用RecycleView需要在build.gradle中添加相应的依赖库 三级目录 ...

松仔Log的博客 1万+

基于RTL8370N的8口千兆无管理交换机硬件设计

无管理交换机是局域网边缘接入的核心基础设备,其本质是通过硬件状态机实现MAC地址学习、线速转发与自动协商,无需软件配置即可完成即插即用组网。原理上依赖高度集成的PHY+交换矩阵单芯片(如RTL8370N),结合确定性硬件逻辑替代MCU固件,保障低延迟、高可靠与零运维。技术价值体现在成本压缩、体积精简与部署极简化,广泛应用于家庭网络扩展、工业现场设备联网及嵌入式系统桥接等场景。本文详解一款基于RTL8370N的紧凑型8端口千兆无管理交换机,覆盖芯片选型依据、PHY接口设计、电源与散热优化等关键工程实践。

weixin_42327217的博客 402

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7734

Android RecyclerView从入门到精通

文章目录一、前言二、RecyclerView 使用入门2.1 添加支持库2.2 将 RecyclerView 添加到布局2.3 在代码中引用 RecyclerView 并配置 一、前言     在以前的Android开发过程中,列表使用 ListView, 网格使用 GridView。随着Android不断的发展,官方推出了许多性能更优的控件,其中 RecyclerView 就是其中之一。RecyclerView 是 ListView 和 GridView 的更高级版

yingaizhu的博客 1023

AutoSAR RTE调度机制揭秘:从定时器事件到Runnable执行的完整流程

本文深入解析了AutoSAR RTE(运行时环境)的核心调度机制,详细阐述了从定时器事件触发到Runnable(可运行实体)执行的完整流程。通过剖析Rte_Start()函数、OS任务与警报的交互,以及事件驱动循环,揭示了RTE如何作为幕后指挥家,高效、可靠地协调软件组件间的周期性任务执行,是打通AutoSAR应用开发的关键。

weixin_29169899的博客 227

Android教程2020 - RecyclerView使用入门

本文介绍RecyclerView的使用入门。这里给出一种比较常见的使用方式。 Android教程2020 - 系列总览 本文链接 想必读者朋友对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。 本文讲述的是在Android开发中用RecyclerView来实现列表效果。 使用步骤 引入RecyclerView 在app的build.gradle文件中添加引用。我...

good575654643的博客 271

Vc出现不能连接到一个或多个 vCenter server 系统:http://vcenter-vx.utibet.edu.cn:443/sdk

问题描述: 解决办法: esxi6.7的bug 第一种通过升级系统来解决问题 第二种是通过删除数据来解决 第一步:进入到esxi的shell 第二步查看其中的服务开启状态 第二步 df -h 第三步 /opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres 第四步 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oi

m0_49328536的博客 9901

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6887

RecyclerView优秀文集,从入门到精通

收集RecyclerView优秀文章,持续更新欢迎提交pr,推荐star。里面的文章是你对RecylerView从入门到精通。 入门篇1 还在用ListView? http://www.jianshu.com/p/a92955be0a3e RecyclerView使用介绍 http://www.jianshu.com/p/12ec590f6c76 RecyclerV

tasty 537

WPF+MVVM案例实战(一)- 设备状态LED灯变化实现

采用WPF+MVVM框架实现,MVVM框架使用CommunityToolkit.Mvvm 依赖包,代码案例部署了三个LED灯,按照红黄绿三色后台自动刷新状态进行变化,根据后台数据不同,UI层显示不同颜色。

lingshuangcanxue 1382

android+教程+最新,Android教程2020 - RecyclerView使用入门

本文介绍RecyclerView的使用入门。这里给出一种比较常见的使用方式。想必读者朋友对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。本文讲述的是在Android开发中用RecyclerView来实现列表效果。使用步骤引入RecyclerView在app的build.gradle文件中添加引用。我们使用的是androidx包。dependencies {// ...im...

weixin_32357285的博客 245

OpenHands:开源AI智能体开发平台实战指南与架构解析

AI智能体(Agent)作为人工智能领域的关键技术,通过模拟人类的推理与行动循环,能够自主规划并执行复杂任务。其核心原理基于ReAct(Reasoning and Acting)框架,结合规划、工具使用与记忆系统,实现了从感知到决策的闭环。在软件工程领域,AI智能体的技术价值在于将自然语言指令转化为具体的开发操作,从而显著提升代码生成、测试编写和系统维护的效率。典型的应用场景包括自动化代码重构、智能文档生成以及持续集成流程的优化。本文聚焦于OpenHands这一开源AI驱动开发平台,它提供了完整的智能体SD

weixin_27021789的博客 460

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RecyclerView 最佳入门

ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView入门 入门

请叫我搞向 2462

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android——RecyclerView入门学习之RecyclerView.Adapter

学习资料: 鸿洋大神为RecyclerView打造通用Adapter让RecyclerView更加好用鸿洋大神Android优雅的为RecyclerView添加HeaderView和FooterView 之前使用RecyclerView.Adapter,基本就类似套用公式,死步骤,对Adapter感到既熟悉又陌生。从去年我开始接触学习Android之时,RecyclerView已经开始大量

ChatHello的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

进击的RecyclerView之入门

虽然RecyclerView面世有一段时间了,但由于它的学习成本相对较高,很多码友只是粗略的认识了一下而没有细致的品味RecyclerView的真谛。那么从现在开始我将带你装逼带你飞,一起领略Google工程师们赋予RecyclerView独特的魅力。 首先我们看一下官方文档是怎么介绍RecyclerView的简介: A flexible view for providing a limi

读万卷书,行万里路 733

Android开发之RecyclerView优秀文集,从入门到精通

原文信息 ⊙作者:CymCHad ⊙原文地址:https://github.com/CymChad/CymChad.github.io 收集RecyclerView优秀文章,持续更新欢迎提交pr,推荐star。里面的文章是你对RecylerView从入门到精通。 入门篇1 还在用ListView? http://www.jians

Mr_Duoduo的博客 765

RecyclerView入门简介

RecyclerView可以看作是ListView的进化版本,当然RecyclerView并不是继承ListView的,RecyclerView直接继承于ViewGroup父类。RecyclerView的灵活性与可替代性比listview更好,我们可以很方便的使用它完成ListView比较难完成的效果。现在,我们开始学习如何使用它

Jerey_Jobs的专栏 527

android,RecyclerView入门

相比ListView,RecyclerView自定义程度比较高,既可以设定每一项的布局,也可以设定整体的布局。 而且RecyclerView还提供了自己的Adapter和ViewHolder 引入依赖 Gradle Scripts ---> build.gradle(Module:app) ---> dependencies{ }中添加如下代码,紧接着重构项目 imple...

不止于代码 364

RecyclerView的入门使用

RecyclerView是listview的替代品,在V7包里面。listview有的,recyclerview全都有,并且灵活性非常强,同时可以实现glid的多行与多列。recyclerview并没有实现添加addHeadview功能,但是我们可以封装一个headerview,这个百度上大把。recyclerview的横向列表非常方便,只要三句代码就可以了。话不多说,直接上代码。 先写一个界面

huangjunyu199115的博客 319
上一篇: android 硬解码播放音视频
下一篇: BottomNavigationView入门
路ボ
博客等级 码龄7年 24粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值