Android 仿快手视频列表,RecyclerView与Banner联动效果

这是看到群里讨论过快手APP的一个观看他人视频列表的一个联动效果,但是并不是完全按照这个软件的效果来做的,只是参考,并不是完全仿照这个软件来做的,没时间去优化排版问题了,请见谅,如图:

实现效果如下:

1.主函数代码:

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;import com.example.mytestapplication.R;
import com.example.mytestapplication.adapter.ImageAdapter;
import com.example.mytestapplication.bean.DataBean;
import com.example.mytestapplication.bean.SelectBean;
import com.example.mytestapplication.databinding.ActivityYouthBannerBinding;
import com.example.mytestapplication.pbl.FullyStaggeredGridLayoutManager;
import com.example.mytestapplication.recycler.BannerScreenAdapter;
import com.example.mytestapplication.recycler.ScreenAllAdapter;
import com.google.android.material.snackbar.Snackbar;
import com.youth.banner.indicator.CircleIndicator;
import com.youth.banner.listener.OnBannerListener;
import com.youth.banner.listener.OnPageChangeListener;import java.util.ArrayList;
import java.util.List;/*** https://github.com/youth5201314/banner** https://blog.csdn.net/u014628886/article/details/52074383** https://blog.csdn.net/itTalmud/article/details/130330097*/
public class YouthBannerActivity extends AppCompatActivity {private ActivityYouthBannerBinding binding;private FullyStaggeredGridLayoutManager slm = null;private List<Integer> picList;private ImageAdapter adapter;private Integer[] mImgIds = {R.drawable.image7, R.drawable.image8, R.drawable.image9, R.drawable.image10, R.drawable.image11};private BannerScreenAdapter mBannerScreenAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_youth_banner, null, false);setContentView(binding.getRoot());binding.btTest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {binding.banner.setCurrentItem(2);binding.banner.stop();}});initData();}private void initData() {// 轮播的图片集合picList = new ArrayList<>();picList.add(R.mipmap.aa);picList.add(R.mipmap.ab);picList.add(R.mipmap.ac);picList.add(R.mipmap.mm);picList.add(R.mipmap.aa);picList.add(R.mipmap.ab);picList.add(R.mipmap.ac);picList.add(R.mipmap.mm);picList.add(R.mipmap.aa);picList.add(R.mipmap.ab);picList.add(R.mipmap.ac);picList.add(R.mipmap.mm);//模拟数据源ArrayList imgLists = new ArrayList<>();for (int i = 0; i < mImgIds.length; i++) {imgLists.add(mImgIds[i]);}List<SelectBean> selectBeans = SelectBean.getTestData();List<DataBean> datas =  DataBean.getTestData2();//自定义的图片适配器,也可以使用默认的BannerImageAdapteradapter = new ImageAdapter(datas);binding.banner.setAdapter(adapter)
//              .setCurrentItem(0,false)//添加生命周期观察者.addBannerLifecycleObserver(this)//设置指示器.setIndicator(new CircleIndicator(this)).setOnBannerListener((data, position) -> {
//                    Snackbar.make(binding.banner, ((DataBean) data).title, Snackbar.LENGTH_SHORT).show();
//                    LogUtils.d("position:" + position);});//添加item之间切换时的间距(如果使用了画廊效果就不要添加间距了,因为内部已经添加过了)
//        banner.addPageTransformer(new MarginPageTransformer( BannerUtils.dp2px(10)));//Banner点击事件binding.banner.setOnBannerListener(new OnBannerListener() {@Overridepublic void OnBannerClick(Object data, int position) {//点击Banner,关联对应的RecyclerView数据binding.rvScreen.scrollToPosition(position);mBannerScreenAdapter.setPosition(position);mBannerScreenAdapter.notifyDataSetChanged();}});//        binding.banner.setOnScrollChangeListener(new View.OnScrollChangeListener() {
//            @Override
//            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
//
//            }
//        });//Banner滑动监听事件binding.banner.addOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//点击Banner,关联对应的RecyclerView数据binding.rvScreen.scrollToPosition(position);mBannerScreenAdapter.setPosition(position);mBannerScreenAdapter.notifyDataSetChanged();}@Overridepublic void onPageSelected(int position) {}@Overridepublic void onPageScrollStateChanged(int state) {}});mBannerScreenAdapter = new BannerScreenAdapter(this, selectBeans);LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);binding.rvScreen.setLayoutManager(layoutManager);binding.rvScreen.setAdapter(mBannerScreenAdapter);mBannerScreenAdapter.setOnItemClickListener(new BannerScreenAdapter.OnItemClickListener() {@Overridepublic void onItemClick(int position) {binding.banner.setCurrentItem(position+1);binding.banner.stop();}});}@Overrideprotected void onStop() {super.onStop();}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();}
}

主函数布局:

<layout 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"><data></data><RelativeLayout xmlns:banner="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.youth.banner.Bannerandroid:id="@+id/banner"android:layout_width="280dp"android:layout_height="180dp"android:layout_margin="10dp"banner:banner_indicator_normal_color="@android:color/white"banner:banner_indicator_selected_color="@color/purple_500"banner:banner_radius="5dp" /><com.youth.banner.indicator.RoundLinesIndicatorandroid:id="@+id/indicator"android:layout_width="300dp"android:layout_height="20dp"android:layout_below="@+id/banner"android:layout_centerHorizontal="true"android:visibility="gone" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rvScreen"android:layout_margin="10dp"android:layout_width="100dp"android:layout_height="180dp"android:layout_alignParentRight="true"/><Buttonandroid:id="@+id/btTest"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="刷新"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp" /></RelativeLayout>
</layout>

实体类:

import com.example.mytestapplication.R;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class SelectBean implements Serializable {public Integer imageRes;public Integer getImageRes() {return imageRes;}public void setImageRes(Integer imageRes) {this.imageRes = imageRes;}public boolean isSelect() {return isSelect;}public void setSelect(boolean select) {isSelect = select;}public boolean isSelect;public SelectBean(Integer imageRes, boolean isSelect) {this.imageRes = imageRes;this.isSelect = isSelect;}//    public SelectBean(String imageUrl, String title, int viewType) {
//        this.imageUrl = imageUrl;
//        this.title = title;
//        this.viewType = viewType;
//    }public static List<SelectBean> getTestData() {List<SelectBean> list = new ArrayList<>();list.add(new SelectBean(R.drawable.image7, false));list.add(new SelectBean(R.drawable.image8, false));list.add(new SelectBean(R.drawable.image9, false));list.add(new SelectBean(R.drawable.image10, false));list.add(new SelectBean(R.drawable.image11, false));return list;}public static List<String> getColors(int size) {List<String> list = new ArrayList<>();for(int i = 0; i < size; i++) {list.add(getRandColor());}return list;}/*** 获取十六进制的颜色代码.例如  "#5A6677"* 分别取R、G、B的随机值,然后加起来即可** @return String*/public static String getRandColor() {String R, G, B;Random random = new Random();R = Integer.toHexString(random.nextInt(256)).toUpperCase();G = Integer.toHexString(random.nextInt(256)).toUpperCase();B = Integer.toHexString(random.nextInt(256)).toUpperCase();R = R.length() == 1 ? "0" + R : R;G = G.length() == 1 ? "0" + G : G;B = B.length() == 1 ? "0" + B : B;return "#" + R + G + B;}
}
import com.example.mytestapplication.R;import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class DataBean {public Integer imageRes;public String imageUrl;public String title;public int viewType;public DataBean(Integer imageRes, String title, int viewType) {this.imageRes = imageRes;this.title = title;this.viewType = viewType;}public DataBean(String imageUrl, String title, int viewType) {this.imageUrl = imageUrl;this.title = title;this.viewType = viewType;}public static List<DataBean> getTestData() {List<DataBean> list = new ArrayList<>();list.add(new DataBean(R.drawable.image1, "相信自己,你努力的样子真的很美", 1));list.add(new DataBean(R.drawable.image2, "极致简约,梦幻小屋", 3));list.add(new DataBean(R.drawable.image3, "超级卖梦人", 3));list.add(new DataBean(R.drawable.image4, "夏季新搭配", 1));list.add(new DataBean(R.drawable.image5, "绝美风格搭配", 1));list.add(new DataBean(R.drawable.image6, "微微一笑 很倾城", 3));return list;}public static List<DataBean> getTestData2() {List<DataBean> list = new ArrayList<>();list.add(new DataBean(R.drawable.image7, "听风.赏雨", 3));list.add(new DataBean(R.drawable.image8, "迪丽热巴.迪力木拉提", 1));list.add(new DataBean(R.drawable.image9, "爱美.人间有之", 3));list.add(new DataBean(R.drawable.image10, "洋洋洋.气质篇", 1));list.add(new DataBean(R.drawable.image11, "生活的态度", 3));return list;}/*** 仿淘宝商品详情第一个是视频* @return*/public static List<DataBean> getTestDataVideo() {List<DataBean> list = new ArrayList<>();list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/09/mp4/190309153658147087.mp4", "第一个放视频", 2));list.add(new DataBean(R.drawable.image7, "听风.赏雨", 1));list.add(new DataBean(R.drawable.image8, "迪丽热巴.迪力木拉提", 1));list.add(new DataBean(R.drawable.image9, "爱美.人间有之", 1));list.add(new DataBean(R.drawable.image10, "洋洋洋.气质篇", 1));list.add(new DataBean(R.drawable.image11, "生活的态度", 1));return list;}public static List<DataBean> getTestData3() {List<DataBean> list = new ArrayList<>();list.add(new DataBean("https://img.zcool.cn/community/013de756fb63036ac7257948747896.jpg", null, 1));list.add(new DataBean("https://img.zcool.cn/community/01639a56fb62ff6ac725794891960d.jpg", null, 1));list.add(new DataBean("https://img.zcool.cn/community/01270156fb62fd6ac72579485aa893.jpg", null, 1));list.add(new DataBean("https://img.zcool.cn/community/01233056fb62fe32f875a9447400e1.jpg", null, 1));list.add(new DataBean("https://img.zcool.cn/community/016a2256fb63006ac7257948f83349.jpg", null, 1));return list;}public static List<DataBean> getVideos() {List<DataBean> list = new ArrayList<>();list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4", null, 0));list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4", null, 0));list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318214226685784.mp4", null, 0));list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4", null, 0));list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4", null, 0));list.add(new DataBean("http://vfx.mtime.cn/Video/2019/03/14/mp4/190314102306987969.mp4", null, 0));return list;}public static List<String> getColors(int size) {List<String> list = new ArrayList<>();for(int i = 0; i < size; i++) {list.add(getRandColor());}return list;}/*** 获取十六进制的颜色代码.例如  "#5A6677"* 分别取R、G、B的随机值,然后加起来即可** @return String*/public static String getRandColor() {String R, G, B;Random random = new Random();R = Integer.toHexString(random.nextInt(256)).toUpperCase();G = Integer.toHexString(random.nextInt(256)).toUpperCase();B = Integer.toHexString(random.nextInt(256)).toUpperCase();R = R.length() == 1 ? "0" + R : R;G = G.length() == 1 ? "0" + G : G;B = B.length() == 1 ? "0" + B : B;return "#" + R + G + B;}
}

适配器:

import android.view.ViewGroup;
import android.widget.ImageView;import com.example.mytestapplication.bean.DataBean;
import com.example.mytestapplication.viewholder.ImageHolder;
import com.youth.banner.adapter.BannerAdapter;import java.util.List;/*** 自定义布局,图片*/
public class ImageAdapter extends BannerAdapter<DataBean, ImageHolder> {public ImageAdapter(List<DataBean> mDatas) {//设置数据,也可以调用banner提供的方法,或者自己在adapter中实现super(mDatas);}//更新数据public void updateData(List<DataBean> data) {//这里的代码自己发挥,比如如下的写法等等mDatas.clear();mDatas.addAll(data);notifyDataSetChanged();}//创建ViewHolder,可以用viewType这个字段来区分不同的ViewHolder@Overridepublic ImageHolder onCreateHolder(ViewGroup parent, int viewType) {ImageView imageView = new ImageView(parent.getContext());//注意,必须设置为match_parent,这个是viewpager2强制要求的ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);imageView.setLayoutParams(params);imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);return new ImageHolder(imageView);}@Overridepublic void onBindView(ImageHolder holder, DataBean data, int position, int size) {holder.imageView.setImageResource(data.imageRes);}}
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;import androidx.recyclerview.widget.RecyclerView;import com.example.mytestapplication.R;
import com.example.mytestapplication.bean.SelectBean;import java.util.List;/*** https://www.itguest.com/post/aeijeb1a1.html* @date 2020/12/10* desc*/
public class BannerScreenAdapter extends RecyclerView.Adapter<BannerScreenAdapter.ViewHolder> {private Context context;private List<Integer> mDataList;private List<SelectBean> mSelectBeanList;private OnItemClickListener onItemClickListener;private int mPosition = -1;private int currentPosition;private boolean isClick;private LinearLayout llView;//    public BannerScreenAdapter(Context context, List<Integer> dataList) {
//        this.context = context;
//        this.mDataList = dataList;
//    }public BannerScreenAdapter(Context context, List<SelectBean> dataList) {this.context = context;this.mSelectBeanList = dataList;}@Overridepublic int getItemCount() {
//        return Integer.MAX_VALUE;return mSelectBeanList.size();}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {final View view = LayoutInflater.from(context).inflate(R.layout.item_banner_screen, parent, false);final ViewHolder vh = new ViewHolder(view);int adapterPosition = vh.getAdapterPosition();int position = vh.getPosition();//        boolean isSelect = mSelectBeanList.get(position).isSelect;
//        if(isSelect){
//            llView.setBackgroundResource(R.drawable.shape_bg_blue);
//        }else {
//            llView.setBackgroundResource(R.drawable.tab_bg);
//        }//        view.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                int adapterPosition = vh.getAdapterPosition();
//                int position = vh.getPosition();for (int i = 0; i < mSelectBeanList.size(); i++) {if(adapterPosition == i){mSelectBeanList.get(vh.getPosition()).setSelect(true);setCurrentPosition(vh.getAdapterPosition(), true);}else {mSelectBeanList.get(vh.getPosition()).setSelect(false);setCurrentPosition(vh.getAdapterPosition(), false);}}
//                if(!isClick){
//                    //调用setCurrentPosition()方法
//                    setCurrentPosition(vh.getAdapterPosition(),true);//记录并设为true
//                }else {
//                    //当某项点击状态为true 点击的时候判断当前位置和getAbsoluteAdapterPosition()为点击更新后适配器的位置是否一致?不一致说明点击了新的选项,记录isClick为false 更新新的位置。
//                    setCurrentPosition(vh.getAdapterPosition(), //记录当前点击
//                            getCurrentPosition()!=vh.getAdapterPosition());
//                }
//
//                notifyDataSetChanged();
//                onItemClickListener.onItemClick(vh.getPosition());notifyItemChanged(position);
//            }
//        });return vh;}@Overridepublic void onBindViewHolder(ViewHolder holder, @SuppressLint("RecyclerView") int position) {
//        int newPos = position % mDataList.size();int newPos = position % mSelectBeanList.size();holder.mDisplay.setImageResource(mSelectBeanList.get(newPos).getImageRes());holder.itemView.setTag(position);holder.mLlView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mPosition = position;
//                mSelectBeanList.get(position).setSelect(true);notifyDataSetChanged();onItemClickListener.onItemClick(position);}});boolean isSelect = mSelectBeanList.get(getCurrentPosition()).isSelect;
//        if(getCurrentPosition() == position && isSelect){if(mPosition == position){
//            holder.mLlView.setBackgroundResource(R.drawable.shape_bg_blue);//单选:设置选择的背景holder.mLlView.setBackgroundResource(R.drawable.tab_bg);//选中后设置缩放动画:将图片放大一些ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f,1.1f);valueAnimator.setDuration(500);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {//获取动画属性值float value = (float) animation.getAnimatedValue();holder.mDisplay.setScaleX(value);holder.mDisplay.setScaleY(value);}});valueAnimator.start();}else {holder.mLlView.setBackgroundResource(R.drawable.shape_transparent_bg);}}class ViewHolder extends RecyclerView.ViewHolder {ImageView mDisplay;LinearLayout mLlView;public ViewHolder(View itemView) {super(itemView);mDisplay = itemView.findViewById(R.id.iv_display);mLlView = itemView.findViewById(R.id.ll_view);}}public void setOnItemClickListener(OnItemClickListener listener) {this.onItemClickListener = listener;}public interface OnItemClickListener {void onItemClick(int position);}//创建getCurrentPosition 返回当前位置private int getCurrentPosition() {return currentPosition;}//创建setCurrentPosition方法 记录当前点击选项和点击状态public void setCurrentPosition(int currentPosition,boolean isClick){this.currentPosition=currentPosition;this.isClick=isClick;}public void setPosition(int position){this.mPosition = position;}
}

shape选择背景: 

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:gravity="center"><shape><!-- 设置圆角 --><corners android:radius="5dp" /><!-- 设置边框 --><strokeandroid:width="1dp"android:color="@color/transparent" /></shape></item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:gravity="center"><shape><!-- 设置圆角 --><corners android:radius="5dp" /><!-- 设置边框 --><strokeandroid:width="1dp"android:color="@color/teal_700" /></shape></item>
</layer-list>

颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="purple_200">#FFBB86FC</color><color name="purple_500">#FF6200EE</color><color name="purple_700">#FF3700B3</color><color name="teal_200">#FF03DAC5</color><color name="teal_700">#FF018786</color><color name="black">#FF000000</color><color name="white">#FFFFFFFF</color><color name="grey_666">#666666</color><color name="transparent">#00000000</color>
</resources>

适配器布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="80dp"android:layout_height="wrap_content"android:layout_marginBottom="5dp"android:id="@+id/ll_view"android:gravity="center"android:background="@color/white"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_display"android:layout_width="50dp"android:layout_height="50dp"android:padding="1dp"tools:src="@mipmap/ic_launcher" /></LinearLayout>

依赖文件build.gradle.kts:

plugins {id("com.android.application")
}android {namespace = "com.example.mytestapplication"compileSdk = 33dataBinding {enable = true}defaultConfig {applicationId = "com.example.mytestapplication"minSdk = 24targetSdk = 33versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = JavaVersion.VERSION_1_8}buildFeatures {viewBinding = true}
}dependencies {implementation("androidx.appcompat:appcompat:1.6.1")implementation("com.google.android.material:material:1.8.0")implementation("androidx.constraintlayout:constraintlayout:2.1.4")implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")implementation("androidx.navigation:navigation-fragment:2.5.3")implementation("androidx.navigation:navigation-ui:2.5.3")testImplementation("junit:junit:4.13.2")androidTestImplementation("androidx.test.ext:junit:1.1.5")androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")implementation ("com.github.bumptech.glide:glide:4.12.0")implementation ("androidx.palette:palette:1.0.0")implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
//    implementation ("com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22")implementation ("io.github.youth5201314:banner:2.2.1")
}

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><!--允许Glide监视连接状态,并在用户从断开连接到已连接网络的状态。--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyTestApplication"tools:targetApi="31"><activityandroid:name=".youth.YouthBannerActivity"android:exported="true"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

2.图片如下:

项目源码:点击下载源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何分析测试任务及需求(附分析流程)

测试分析 确认测试范围 根据测试项目的不同需求&#xff0c;有大致几类测试项目类型&#xff1a;商户/平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析&#xff0c;并给出对应的输出…

Swift 周报 第四十五期

文章目录 前言新闻和社区苹果或将扩充健康版图&#xff0c;为Apple Watch X铺路更新后的《Apple Developer Program 许可协议》现已发布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十五期&#xff0c;每个模块已初步成型。各位…

【Linux 内核源码分析】RCU机制

RCU 基本概念 Linux内核的RCU&#xff08;Read-Copy-Update&#xff09;机制是一种用于实现高效读取和并发更新数据结构的同步机制。它在保证读操作不被阻塞的同时&#xff0c;也能够保证数据的一致性。 RCU的核心思想是通过延迟资源释放来实现无锁读取&#xff0c;并且避免了…

IOS自动化测试元素定位

一、元素属性介绍 1、元素属性 2、查看各定位方式执行效率 二、iOS常用定位方法 1、accessibility_id 2、class_name 3、Xpath 4、ios_class_chain(类型链) 5、ios_predicate(谓词) 一个页面最基本组成单元是元素&#xff0c;想要定位一个元素&#xff0c;我们需…

Linux网络服务部署yum仓库

目录 一、网络文件 1.1.存储类型 1.2.FTP 文件传输协议 1.3.传输模式 二、内网搭建yum仓库 一、网络文件 1.1.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff0…

01-15

#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);//判断是否有该数据库if(!db.contains("stuInfo.db")){//说明数据库不存在 则创建dbQSqlDatabase::addDatabase("QSQLITE")…

ELK之Filebeat输出日志格式设置及输出字段过滤和修改

一、Filebeat输出日志格式设置 1.1 编辑vim filebeat.yml文件,修改输出格式设置 # output to console output.console:codec.format: string: %{[@timestamp]} %{[message]}pretty: true### 1.2 测试 执行 ./filebeat -e 可以看到/tmp/access.log(目前文件里只有140.77.188…

【LV12 DAY9 ADC实验】

电压在1501mv~1800mv时&#xff0c;LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时&#xff0c;LED2、LED3、LED4点亮 电压在501mv~1000mv时&#xff0c;LED2、LED3点亮 电压在0mv~500mv时&#xff0c;LED2闪烁 #include "exynos_4412.h"void delay(unsigned in…

大语言模型系列-总述

大语言模型发展史 研究人员发现&#xff0c;扩展预训练模型&#xff08;Pre-training Language Model&#xff0c;PLM&#xff09;&#xff0c;例如扩展模型大小或数据大小&#xff0c;通常会提高下游任务的模型性能&#xff0c;模型大小从几十亿&#xff08;1 B 10亿&#x…

Mysql判断一个表中的数据是否在另一个表存在

方式一&#xff1a; 判断A表中有多少条数据在B表中【存在】,并且显示这些数据–EXISTS语句 select A.ID, A.NAME from 表A where EXISTS(select * from 表B where A.IDB.ID) 判断A表中有多少条数据在B表中【不存在】&#xff0c;并且显示这些数据–NOT EXISTS语句 select …

使用Go语言通过API获取代理IP并使用获取到的代理IP

目录 前言 【步骤一&#xff1a;获取代理IP列表】 【步骤二&#xff1a;使用代理IP发送请求】 【完整代码】 【总结】 前言 在网络爬虫、数据抓取等场景中&#xff0c;经常需要使用代理IP来隐藏真实的IP地址&#xff0c;以及增加请求的稳定性和安全性。本文将介绍如何使用…

ubuntu22: nvtop no gpu to monitor.

解决方法&#xff1a; 重新下载nvtop sudo apt update sudo apt -y install nvtop真是逆天 &#xff0c;ubuntu系统的nvidia driver突然坏了&#xff0c;然后我重装了nvidia driver, 之后用nvtop就出现这个问题了&#xff0c;但是逆天的是我竟然没有搜到一篇中文的帖子讲这个问…

NLP论文阅读记录 - 2021 | WOS 使用 GA-HC 和 PSO-HC 改进新闻文章的文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试 二.相关工作三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Improved Text Summa…

云卷云舒:2023年,我眼中的十大数据库

我眼中的十大数据库&#xff0c;只要看成长性和演进速度&#xff08;个见勿怪&#xff09;。 一、五强 1、openGauss&#xff1a;生态影响力变大&#xff0c;基于高斯的产品层出不穷 2、OceanBase&#xff1a;只因霸榜&#xff0c;技术强大&#xff0c;新特性更新频繁&#x…

lv14 并发控制:上下文、中断屏蔽和原子变量

1 上下文和并发场合 执行流&#xff1a;有开始有结束总体顺序执行的一段代码 又称上下文 应用编程&#xff1a;任务上下文 内核编程&#xff1a; 任务上下文&#xff1a;五状态 可阻塞 a. 应用进程或线程运行在用户空间b. 应用进程或线程运行在内核空间&#xff08;通过调用…

python基础语法看一篇就够了,全网最全python语法笔记汇总

前言 Python 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。 如能在实战中融会贯通、灵活使用&#xff0c;必将使代码更为精炼、高效&#xff0c;同时也会极…

提前避坑Anzo Capital总结浮动差价的3个缺点

在交易中很多投资者倾向于选择浮动差价模式&#xff0c;这种模式的便利性就不言而喻了&#xff0c;但Anzo Capital需要提醒各位投资者&#xff0c;一定要知道浮动差价的3个缺点&#xff0c;在交易中提前避坑&#xff0c;下面Anzo Capital就和各位投资者一起总结浮动差价的这3…

leetcode 24两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思想 对于操作链表节点的时候&#xff0c;首先需要就是创建一个虚拟的…

前端动画特效分享(附在线预览)

分享几款不错的动画特效源码 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas爱心代码动画 爱心代码动画特效 由里向外不断的产生的小爱心形成一个巨大的爱心动画 以下图片…

Maxwell数据同步(增量)

1. Maxwell简介 1.1 Maxwell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流…