当前位置:网站首页>ViewPager2+Fragment
ViewPager2+Fragment
2022-07-28 12:11:00 【Fierce Bugs Bunny】
review
1.Fragment The birth of
Fragment It can be regarded as a small Activity, But do you know Fragment What is the cause of this ?

Fragment, Chinese translation is debris ,Fragments In activity Activity Change the layout configuration for different screen sizes ( A small screen may display one clip at a time , And the big screen can show two or more )
Use Fragment It is equivalent to one layout adapting to two devices
To make a Activity Simple configuration interface
A simple and efficient , Easy to maintain .
What is? Fragment
Fragment Must parasitize on a host Activity in , Equivalent to a son Activity
**Activity Send a message to Fragment
Native Bundle
2. How to hide the title bar
private void hideBar(){
ActionBar actionBar = getSupportActionBar();
if(actionBar!=null){
actionBar.hide();
}
}
ViewPager2
Introduce
Allow pages with data to be flipped left and right
Analysis of the source code
ViewPager2 Although it is inherited from ViewGroup, But actually it is Yes RecyclerView Encapsulation
Let's take a look first ViewPager2 The basic source code , A focus on initialize Method inside :
private void initialize(Context context, AttributeSet attrs) {
// initialization RecyclerView
mRecyclerView = new RecyclerViewImpl(context);
mRecyclerView.setId(ViewCompat.generateViewId());
// initialization LayoutManager
mLayoutManager = new LinearLayoutManagerImpl(context);
mRecyclerView.setLayoutManager(mLayoutManager);
setOrientation(context, attrs);
mRecyclerView.setLayoutParams(
new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
mRecyclerView.addOnChildAttachStateChangeListener(enforceChildFillListener());
// Create the object of the sliding event converter
mScrollEventAdapter = new ScrollEventAdapter(mLayoutManager);
// Create objects that simulate drag events
mFakeDragger = new FakeDrag(this, mScrollEventAdapter, mRecyclerView);
// establish PagerSnapHelper object , Used to achieve the basic effect of page switching
mPagerSnapHelper = new PagerSnapHelperImpl();
mPagerSnapHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnScrollListener(mScrollEventAdapter);
// ······
}
stay initialize Method inside , Primary initialization RecyclerView The basic configuration and basic components of include :
1. to RecyclerView Set sliding listening events (ScrollEventAdapter)
2. Set up PagerSnapHelper, Achieve the effect of page switching
Specific source code analysis can be viewed :ViewPager2 Principle analysis - Simple books (jianshu.com)
example 1: Production of simple rotation map
[ Failed to transfer the external chain picture , The origin station may have anti-theft chain mechanism , It is suggested to save the pictures and upload them directly (img-2QQTq0tt-1656562525156)(https://gitee.com/guan-xiongyao/image/raw/master/img/20220416153008.png)]
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<androidx.viewpager2.widget.ViewPager2 android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/viewPager" >
</androidx.viewpager2.widget.ViewPager2>
</LinearLayout>
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager2 viewPager = findViewById(R.id.viewPager);
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter();
viewPager.setAdapter(viewPagerAdapter); // to ViewPager Configure adapter
}
}
newly build XML file : Name it item_pager
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container">
<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/ivImage" android:layout_centerInParent="true" android:scaleType="centerCrop" />
<!-- centerCrop Scale the picture equally , Let the short edge of the image match ImageView The length of the side is the same , That is, no blank space can be left , After zooming, the middle part is intercepted for display . fitXY It's the horizontal direction of the original picture ( namely XY Direction ) Drawn after stretching , Will change the original proportion -->
</RelativeLayout>
newly build ViewPagerAdapter.java file
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder> {
// Image array
private List<Integer> img = new ArrayList<>();
// Add an array of pictures to the constructor of the adapter
public ViewPagerAdapter(){
img.add(R.drawable.gdufs);
img.add(R.drawable.gdufs2);
img.add(R.drawable.world); // The pictures here can be added by yourself
}
// onCreatedViewHolder() Method is used to bind item View
@NonNull
@Override
public ViewPagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewPagerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pager,parent,false));
}
// The function of this method is to match the data with the view (ViewHolder) binding
@Override
public void onBindViewHolder(@NonNull ViewPagerViewHolder holder, int position) {
holder.mIv.setImageResource(img.get(position));
}
// return Item The number of , That is to say ViewPager Number of pages you can slide
@Override
public int getItemCount() {
return img.size();
}
// establish ViewHolder Inner class , Used to store and bind instantiated Item object
class ViewPagerViewHolder extends RecyclerView.ViewHolder{
ImageView mIv;
RelativeLayout mContainer;
public ViewPagerViewHolder(@NonNull View itemView) {
super(itemView);
mContainer = itemView.findViewById(R.id.container);
mIv = itemView.findViewById(R.id.ivImage);
}
}
}
ViewPager2+Fragment The combination of
example 2: Up and down navigation bar
[ Failed to transfer the external chain picture , The origin station may have anti-theft chain mechanism , It is suggested to save the pictures and upload them directly (img-qgtf4nd3-1656562525157)(https://gitee.com/guan-xiongyao/image/raw/master/img/20220416171627.png)]

level ViewPager
xml file :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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.example.ViewPager2.activity.HorizontalScroll">
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/vp_h" android:layout_width="match_parent" android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import com.example.ViewPager2.adapter.HorizontalVpAdapter;
import com.example.viewpagers.R;
public class HorizontalScroll extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_horizontal_scroll);
ViewPager2 viewPager2 = findViewById(R.id.vp_h);
HorizontalVpAdapter adapter = new HorizontalVpAdapter(this);
viewPager2.setAdapter(adapter);
}
}
Adapter file :HorizontalVpAdapter.java
package com.example.ViewPager2.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.viewpagers.R;
import java.util.ArrayList;
import java.util.List;
public class HorizontalVpAdapter extends RecyclerView.Adapter<HorizontalVpAdapter.HorizontalVpViewHolder> {
private List<Integer> backgrounds;
private Context mContext;
// Construction method of adapter , Add different backgrounds to the array
public HorizontalVpAdapter(Context context){
mContext = context;
if(backgrounds == null){
backgrounds = new ArrayList<>();
backgrounds.add(R.color.blue);
backgrounds.add(R.color.white);
backgrounds.add(R.color.black);
backgrounds.add(R.color.teal_200);
backgrounds.add(R.color.teal_700);
backgrounds.add(R.color.purple_200);
}
}
// onCreatedViewHolder() Method is used to bind item View
@NonNull
@Override
public HorizontalVpViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new HorizontalVpViewHolder(LayoutInflater.from(mContext)
.inflate((R.layout.item), parent, false));
}
// The function of this method is to match the data with the view (ViewHolder) binding
@Override
public void onBindViewHolder(@NonNull HorizontalVpViewHolder holder, int position) {
holder.mTextView.setText(" The first " + (position + 1) + " Interface ");
holder.mLinearLayout.setBackgroundColor(backgrounds.get(position));
}
// return Item The number of , That is to say ViewPager Number of pages you can slide
@Override
public int getItemCount() {
if(backgrounds == null){
return 0;
}
return backgrounds.size();
}
// establish ViewHolder Inner class , Used to store and bind instantiated Item object
class HorizontalVpViewHolder extends RecyclerView.ViewHolder {
private LinearLayout mLinearLayout;
private TextView mTextView;
HorizontalVpViewHolder(@NonNull View itemView) {
super(itemView);
mLinearLayout = itemView.findViewById(R.id.item_ll_background);
mTextView = itemView.findViewById(R.id.item_tv_title);
}
}
}
item.xml file :
<?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" android:id="@+id/item_ll_background">
<TextView android:id="@+id/item_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
vertical ViewPager
The vertical is the same as the horizontal , Only need android:orientation=“vertical” that will do , Others are the same
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/vp_v" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"/>
Bottom navigation bar ——RadioGroup And ViewPager 2 Continuous use

java file NavigationBottom.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import com.example.ViewPager2.adapter.RgAdapter;
import com.example.ViewPager2.fragment.HomeFragment;
import com.example.ViewPager2.fragment.MessageFragment;
import com.example.ViewPager2.fragment.MyFragment;
import com.example.viewpagers.R;
public class NavigationBottom extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private ViewPager2 vpRg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation_bottom);
RgAdapter adapter = new RgAdapter(this);
RadioGroup rg = findViewById(R.id.rg);
vpRg = findViewById(R.id.vp_rg);
rg.setOnCheckedChangeListener(this);
vpRg.setAdapter(adapter);
adapter.addFragment(new HomeFragment());
adapter.addFragment(new MessageFragment());
adapter.addFragment(new MyFragment());
vpRg.setCurrentItem(0);
// This method can monitor ViewPager 2 The interface changes , Then operate other controls .
vpRg.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
switch (position){
case 0:
((RadioButton)findViewById(R.id.rb_home)).setChecked(true);
break;
case 1:
((RadioButton)findViewById(R.id.rb_msg)).setChecked(true);
break;
case 2:
((RadioButton)findViewById(R.id.rb_my)).setChecked(true);
break;
}
}
});
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.rb_home:
vpRg.setCurrentItem(0);
break;
case R.id.rb_msg:
vpRg.setCurrentItem(1);
break;
case R.id.rb_my:
vpRg.setCurrentItem(2);
break;
}
}
}
Adapter file RgAdapter.java
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import java.util.ArrayList;
import java.util.List;
public class RgAdapter extends FragmentStateAdapter {
private List<Class> fragments;
public RgAdapter(@NonNull FragmentActivity fragmentActivity){
super(fragmentActivity);
if(fragments == null){
fragments = new ArrayList<>();
}
}
public void addFragment(Fragment fragment){
if(fragments != null){
fragments.add(fragment.getClass());
}
}
@NonNull
@Override
public Fragment createFragment(int position) {
try {
return (Fragment) fragments.get(position).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
@Override
public int getItemCount() {
return fragments.size();
}
}
newly build color Folder :select_rg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/teal_200" android:state_checked="true"/>
<item android:color="@color/grey" android:state_checked="false" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/vp_rg" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/rg"/>
<View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="#d9d9d9" android:layout_above="@id/rg" />
<RadioGroup android:id="@+id/rg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:paddingTop="5dp" >
<RadioButton android:id="@+id/rb_home" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:checked="true" android:drawableTop="@drawable/selector_home" android:drawablePadding="5dp" android:gravity="center" android:paddingTop="5dp" android:paddingBottom="5dp" android:text="@string/home" android:textColor="@color/select_rg" android:textSize="16sp" />
<RadioButton android:id="@+id/rb_msg" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_msg" android:drawablePadding="5dp" android:gravity="center" android:paddingTop="5dp" android:paddingBottom="5dp" android:text="@string/msg" android:textColor="@color/select_rg" android:textSize="16sp"/>
<RadioButton android:id="@+id/rb_my" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_my" android:drawablePadding="5dp" android:gravity="center" android:paddingTop="5dp" android:paddingBottom="5dp" android:text="@string/my" android:textColor="@color/select_rg" android:textSize="16sp"/>
</RadioGroup>
</RelativeLayout>
Top navigation bar ——TabLayout And ViewPager 2 Continuous use
NavigationTop.java file
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import android.graphics.Color;
import android.os.Bundle;
import com.example.ViewPager2.adapter.TabAdapter;
import com.example.viewpagers.R;
import com.google.android.material.tabs.TabLayout;
public class NavigationTop extends AppCompatActivity {
private ViewPager2 vpTab;
private TabLayout tabVp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation_top);
TabAdapter adapter = new TabAdapter(this);
vpTab = findViewById(R.id.vp_tb);
tabVp = findViewById(R.id.tb_vp);
vpTab.setAdapter(adapter); // This is very important !!!
tabVp.setTabTextColors(Color.parseColor("#111111"),Color.parseColor("#0371DD"));
adapter.addColor(android.R.color.holo_blue_bright);
adapter.addColor(android.R.color.holo_red_dark);
adapter.addColor(android.R.color.holo_green_dark);
adapter.addColor(android.R.color.holo_blue_dark);
adapter.addColor(android.R.color.holo_purple);
adapter.addColor(android.R.color.holo_orange_dark);
tabVp.addTab(tabVp.newTab().setText(" The first interface "));
tabVp.addTab(tabVp.newTab().setText(" Second interface "));
tabVp.addTab(tabVp.newTab().setText(" The third interface "));
tabVp.addTab(tabVp.newTab().setText(" The fourth interface "));
tabVp.addTab(tabVp.newTab().setText(" The fifth interface "));
tabVp.addTab(tabVp.newTab().setText(" Sixth interface "));
tabVp.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
vpTab.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
vpTab.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
tabVp.setScrollPosition(position, 0, false);
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
}
});
}
}
xml file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context="com.example.ViewPager2.activity.NavigationTop" >
<com.google.android.material.tabs.TabLayout android:id="@+id/tb_vp" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" app:tabIndicatorFullWidth="false" app:tabIndicatorColor="#0371DD" app:tabRippleColor="@android:color/transparent" app:tabSelectedTextColor="#0371DD" app:tabTextColor="#111111" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" />
<androidx.viewpager2.widget.ViewPager2 android:layout_below="@id/tb_vp" android:id="@+id/vp_tb" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintTop_toBottomOf="@+id/tb_vp" />
</RelativeLayout>
Add child Fragment——ShowFragment.java
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.example.viewpagers.R;
import java.util.ArrayList;
import java.util.List;
/** * A simple {@link Fragment} subclass. * Use the {@link ShowFragment#newInstance} factory method to * create an instance of this fragment. */
public class ShowFragment extends Fragment {
public ShowFragment() {
// Required empty public constructor
}
/** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @return A new instance of fragment ShowFragment. */
// TODO: Rename and change types and number of parameters
public static ShowFragment newInstance(List<Integer> colors, int item) {
ShowFragment fragment = new ShowFragment();
Bundle args = new Bundle();
args.putSerializable("color",(ArrayList<Integer>)colors);
args.putInt("item",item);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_show, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
view.<FrameLayout>findViewById(R.id.fl_show)
.setBackgroundResource(((ArrayList<Integer>) getArguments()
.getSerializable("color")).get(getArguments().getInt("item")));
view.<TextView>findViewById(R.id.tv_show)
.setText(" The first " + (getArguments().getInt("item")+1) + " A page ");
super.onViewCreated(view, savedInstanceState);
}
}
fragment_show.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fl_show" tools:context="com.example.ViewPager2.fragment.ShowFragment">
<!-- TODO: Update blank fragment layout -->
<TextView android:id="@+id/tv_show" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello_blank_fragment" />
</FrameLayout>
Adaptation file : TabAdapter
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.example.ViewPager2.fragment.ShowFragment;
import java.util.ArrayList;
import java.util.List;
public class TabAdapter extends FragmentStateAdapter {
private List<Integer> colors;
public TabAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
if(colors == null){
colors = new ArrayList<>();
}
}
public void addColor(int color){
if(colors != null){
colors.add(color);
}
}
@NonNull
@Override
public Fragment createFragment(int position) {
return ShowFragment.newInstance(colors,position);
}
@Override
public int getItemCount() {
return colors.size();
}
}
expand :ViewPager2+Fragment+RecyclerView
Reference blog :https://blog.csdn.net/xiangshiweiyu_hd/article/details/104005810
port androidx.viewpager2.adapter.FragmentStateAdapter;
import com.example.ViewPager2.fragment.ShowFragment;
import java.util.ArrayList;
import java.util.List;
public class TabAdapter extends FragmentStateAdapter {
private List<Integer> colors;
public TabAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
if(colors == null){
colors = new ArrayList<>();
}
}
public void addColor(int color){
if(colors != null){
colors.add(color);
}
}
@NonNull
@Override
public Fragment createFragment(int position) {
return ShowFragment.newInstance(colors,position);
}
@Override
public int getItemCount() {
return colors.size();
}
}
## expand :ViewPager2+Fragment+RecyclerView
Reference blog :https://blog.csdn.net/xiangshiweiyu_hd/article/details/104005810
边栏推荐
- Minikube initial experience environment construction
- 瑞吉外卖——Day01
- Direct insert sort and Hill sort
- Launcher sample code
- Anonymous subclass objects of abstract classes
- Today's sleep quality record 74 points
- Update dev (development version) of the latest win11
- Saltstack command injection vulnerability analysis (cve-2020-16846)
- Globalthis is not defined solution
- How to make the characters in the photos laugh? HMS core video editing service one click smile function makes people smile more naturally
猜你喜欢

Hcip rip comprehensive experiment

Hcip (condition matching and OSPF packet related knowledge)

Lyscript get previous and next instructions

中国业务型CDP白皮书 | 爱分析报告

Develop your own NPM package from 0

Techniques for visualizing large time series.

Upgrading of computing power under the coordination of software and hardware, redefining productivity

AlexNet—论文分析及复现

Saltstack command injection vulnerability analysis (cve-2020-16846)

Hcip day 1
随机推荐
Will PFP be the future of digital collections?
Notes on using objectanimator
瑞吉外卖——Day01
How async await implements concurrency
ObjectAnimator使用注意点
Stored state and running state of program
Excel shortcut keys (letters + numbers) Encyclopedia
R language ggplot2 visualization: use the ggboxplot function of ggpubr package to visualize the box diagram and customize the fill parameter to configure the filling color of the box
[diary of supplementary questions] [2022 Niuke summer multi school 2] i-let fat tension
OSCache cache monitoring Refresh Tool
Alexnet - paper analysis and reproduction
R language uses dplyr package group_ By function and summarize function calculate the mean value of all covariates involved in the analysis based on grouped variables (difference in means of covariate
Know the optical fiber interface and supporting optical fiber cable of can optical fiber converter in fire alarm networking
简单选择排序与堆排序
安徽京准:北斗卫星同步时钟|北斗同步时钟|NTP网络时钟服务器
[diary of supplementary questions] [2022 Hangdian summer school 2] k-dos card
Hcip (PAP authentication and chap authentication of PPP)
R language ggplot2 visualization: use the ggdotplot function of ggpubr package to visualize the grouped dot plot, set the palette parameter, and set the color of data points in different grouped dot p
[geek challenge 2019] babysql-1 | SQL injection
从0开发一个自己的npm包