当前位置:网站首页>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
边栏推荐
- Interfaces and abstract classes
- 【补题日记】[2022牛客暑期多校2]H-Take the Elevator
- [geek challenge 2019] babysql-1 | SQL injection
- 如何让照片中的人物笑起来?HMS Core视频编辑服务一键微笑功能,让人物笑容更自然
- ObjectAnimator使用注意点
- Hcip day 1
- The reflect mechanism obtains the attribute and method information of class
- Hcip (condition matching and OSPF packet related knowledge)
- OsCache缓存监控刷新工具
- ES6 knowledge points supplement
猜你喜欢
![[real question of written examination]](/img/3f/e061df6a2c5c92429cfd3c69cc94ce.png)
[real question of written examination]

移动端人脸风格化技术的应用

Training mode and practice of digital applied talents in Colleges and Universities under the integration of industry and education

Unity遇坑记之 ab包卸载失败

Techniques for visualizing large time series.

玩转诗词-领略古诗文之美

LyScript 获取上一条与下一条指令

consul安装与配置
![[leetcode] 7. valid anagram · effective letter ectopic words](/img/bc/9806df1358c6f09db03ef2e771aa5a.png)
[leetcode] 7. valid anagram · effective letter ectopic words

The game process and the underlying implementation are gradually completed
随机推荐
String function (Part 2)
What is WordPress
Code simplification
Saltstack command injection vulnerability analysis (cve-2020-16846)
Reasons and solutions for moving the first column to the last column in El table
Detailed explanation of boost official website search engine project
Notes on using objectanimator
2022.07.11 summer training personal qualifying (VI)
Specific process of strong cache and negotiation cache
Consumer installation and configuration
Hcip day 6 (OSPF related knowledge)
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
15、用户web层服务(三)
OsCache缓存监控刷新工具
Minikube initial experience environment construction
Training mode and practice of digital applied talents in Colleges and Universities under the integration of industry and education
直接插入排序与希尔排序
Shell (II)
ObjectAnimator使用注意点
Will PFP be the future of digital collections?