Android ListView鼠标模式下ListView回滚问题

在这里插入图片描述

概述

     在 Android 应用程序中,ListView 是一种常用的控件,用于显示可滚动列表数据。然而,当在鼠标操作模式下使用 ListView 时,可能会遇到一个问题:点击列表项时,列表会回滚到指定位置,这可能会导致用户体验不佳。
在这里插入图片描述

分析

     通过测试发现, 回滚的位置与列表的选中项位置有关系.
在启动activity后, 不执行其他操作时, 通过滚轮直接滚动到列表最下方, 再点击按键, 调用了adapter.notifyDataSetChanged 列表回滚;

dumpsys
dumpsys activity com.android.tester/.cases.ListViewBackground

出现回滚时

View Hierarchy:DecorView@4ef06ab[ListViewBackground]com.android.internal.widget.ActionBarOverlayLayout{1102108 V.E...... ........ 0,0-1920,1080 #1020230 android:id/decor_content_parent}android.widget.FrameLayout{21eb0a1 V.E...... ........ 0,96-1920,1080 #1020002 android:id/content}android.widget.LinearLayout{e6872c6 V.E...... ........ 0,0-1920,984}android.widget.ListView{956287 VFED.VC.. .F...... 0,0-1920,984 #7f030002 app:id/lvRight}android.widget.LinearLayout{f0a45b4 V.E...... ..S..... 0,0-1920,173}android.widget.TextView{5d4b5dd V.ED..... ..S..... 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{e8f552 VFED..C.. ..S..... 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{37d149e V.E...... ........ 0,175-1920,348}android.widget.TextView{8be1b7f V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{88c974c VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{d5ba023 V.E...... ........ 0,350-1920,523}android.widget.TextView{8e00920 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{8ebd2d9 VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{abdc395 V.E...... ........ 0,525-1920,698}android.widget.TextView{ea1dcaa V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{1a2f09b VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{a91dc38 V.E...... ........ 0,700-1920,873}android.widget.TextView{c840411 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{3991976 VFED..C.. ....H... 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{535fb77 V.E...... ........ 0,875-1920,1048}android.widget.TextView{fa483e4 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{f93d04d VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}com.android.internal.widget.ActionBarContainer{3f55702 V.ED..... ........ 0,0-1920,96 #102018e android:id/action_bar_container}android.widget.Toolbar{d84d813 V.E...... ........ 0,0-1920,96 #102018d android:id/action_bar}android.widget.TextView{d17fa50 V.ED..... ........ 36,27-122,68}com.android.internal.widget.ActionBarContextView{b5a2449 G.E...... ......I. 0,0-0,0 #1020192 android:id/action_context_bar}

在启动activity后, 点击列表项(不是BTN所在区域), 通过滚轮直接滚动到列表最下方, 再点击按键, 调用了adapter.notifyDataSetChanged 列表不回滚;

不会滚

View Hierarchy:DecorView@4ef06ab[ListViewBackground]com.android.internal.widget.ActionBarOverlayLayout{1102108 V.E...... ........ 0,0-1920,1080 #1020230 android:id/decor_content_parent}android.widget.FrameLayout{21eb0a1 V.E...... ........ 0,96-1920,1080 #1020002 android:id/content}android.widget.LinearLayout{e6872c6 V.E...... ........ 0,0-1920,984}android.widget.ListView{956287 VFED.VC.. .F..H... 0,0-1920,984 #7f030002 app:id/lvRight}android.widget.LinearLayout{f0a45b4 V.E...... ........ 0,0-1920,173}android.widget.TextView{5d4b5dd V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{e8f552 VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{d5ba023 V.E...... ........ 0,175-1920,348}android.widget.TextView{8e00920 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{8ebd2d9 VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{37d149e V.E...... ........ 0,350-1920,523}android.widget.TextView{8be1b7f V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{88c974c VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{abdc395 V.E...... ........ 0,525-1920,698}android.widget.TextView{ea1dcaa V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{1a2f09b VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{a91dc38 V.E...... ........ 0,700-1920,873}android.widget.TextView{c840411 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{3991976 VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}android.widget.LinearLayout{535fb77 V.E...... ........ 0,875-1920,1048}android.widget.TextView{fa483e4 V.ED..... ........ 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{f93d04d VFED..C.. ........ 1735,0-1920,173 #7f030000 app:id/btn}com.android.internal.widget.ActionBarContainer{3f55702 V.ED..... ........ 0,0-1920,96 #102018e android:id/action_bar_container}android.widget.Toolbar{d84d813 V.E...... ........ 0,0-1920,96 #102018d android:id/action_bar}android.widget.TextView{d17fa50 V.ED..... ........ 36,27-122,68}com.android.internal.widget.ActionBarContextView{b5a2449 G.E...... ......I. 0,0-0,0 #1020192 android:id/action_context_bar}

View状态输出的源码:

frameworks/base/core/java/android/view/View.java

public String toString() {StringBuilder out = new StringBuilder(128);out.append(getClass().getName());out.append('{');out.append(Integer.toHexString(System.identityHashCode(this)));out.append(' ');switch (mViewFlags&VISIBILITY_MASK) {case VISIBLE: out.append('V'); break;case INVISIBLE: out.append('I'); break;case GONE: out.append('G'); break;default: out.append('.'); break;}out.append((mViewFlags&FOCUSABLE_MASK) == FOCUSABLE ? 'F' : '.');out.append((mViewFlags&ENABLED_MASK) == ENABLED ? 'E' : '.');out.append((mViewFlags&DRAW_MASK) == WILL_NOT_DRAW ? '.' : 'D');out.append((mViewFlags&SCROLLBARS_HORIZONTAL) != 0 ? 'H' : '.');out.append((mViewFlags&SCROLLBARS_VERTICAL) != 0 ? 'V' : '.');out.append((mViewFlags&CLICKABLE) != 0 ? 'C' : '.');out.append((mViewFlags&LONG_CLICKABLE) != 0 ? 'L' : '.');out.append((mViewFlags&CONTEXT_CLICKABLE) != 0 ? 'X' : '.');out.append(' ');out.append((mPrivateFlags&PFLAG_IS_ROOT_NAMESPACE) != 0 ? 'R' : '.');out.append((mPrivateFlags&PFLAG_FOCUSED) != 0 ? 'F' : '.');out.append((mPrivateFlags&PFLAG_SELECTED) != 0 ? 'S' : '.');if ((mPrivateFlags&PFLAG_PREPRESSED) != 0) {out.append('p');} else {out.append((mPrivateFlags&PFLAG_PRESSED) != 0 ? 'P' : '.');}out.append((mPrivateFlags&PFLAG_HOVERED) != 0 ? 'H' : '.');out.append((mPrivateFlags&PFLAG_ACTIVATED) != 0 ? 'A' : '.');out.append((mPrivateFlags&PFLAG_INVALIDATED) != 0 ? 'I' : '.');out.append((mPrivateFlags&PFLAG_DIRTY_MASK) != 0 ? 'D' : '.');out.append(' ');out.append(mLeft);out.append(',');out.append(mTop);out.append('-');out.append(mRight);out.append(',');out.append(mBottom);}

从上面的代码可以看出, S代表了View的Selected状态. 通过操作按键的 键改变列表的选中项, 可以看出列表的S项跟随选中项. 而回滚的位置就是选中的位置, 回滚的效果与 setSelection(int pos)相同;

代码中打印ListView.getSelectedItemPosition的返回值, 默认是 0(回滚), 当点击列表项后变为 -1(不回滚)

默认选中从何而来?

打印出setSelected的堆栈信息:

 java.lang.Exception: setSelectedat com.android.tester.widgets.XTV.setSelected(XTV.java:23)at android.view.ViewGroup.dispatchSetSelected(ViewGroup.java:4426)at android.view.View.setSelected(View.java:22276)at android.widget.ListView.setupChild(ListView.java:2102)at android.widget.ListView.makeAndAddView(ListView.java:2055)at android.widget.ListView.fillDown(ListView.java:786)at android.widget.ListView.fillFromTop(ListView.java:847)at android.widget.ListView.layoutChildren(ListView.java:1826)at android.widget.AbsListView.onLayout(AbsListView.java:2165)at android.view.View.layout(View.java:20672)at android.view.ViewGroup.layout(ViewGroup.java:6194)at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1801)at android.widget.LinearLayout.onLayout(LinearLayout.java:1567)at android.view.View.layout(View.java:20672)at android.view.ViewGroup.layout(ViewGroup.java:6194)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)at android.widget.FrameLayout.onLayout(FrameLayout.java:261)at android.view.View.layout(View.java:20672)at android.view.ViewGroup.layout(ViewGroup.java:6194)at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:508)at android.view.View.layout(View.java:20672)at android.view.ViewGroup.layout(ViewGroup.java:6194)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)at android.widget.FrameLayout.onLayout(FrameLayout.java:261)at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)at android.view.View.layout(View.java:20672)at android.view.ViewGroup.layout(ViewGroup.java:6194)at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2796)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2323)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1462)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7187)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)at android.view.Choreographer.doCallbacks(Choreographer.java:761)at android.view.Choreographer.doFrame(Choreographer.java:696)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6669)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:951)

源码中:

frameworks/base/core/java/android/widget/ListView.java

    /*** Fills the list from pos down to the end of the list view.** @param pos The first position to put in the list** @param nextTop The location where the top of the item associated with pos*        should be drawn** @return The view that is currently selected, if it happens to be in the*         range that we draw.*/private View fillDown(int pos, int nextTop) {View selectedView = null;int end = (mBottom - mTop);if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {end -= mListPadding.bottom;}while (nextTop < end && pos < mItemCount) {// is this the selected item?boolean selected = pos == mSelectedPosition;View child = makeAndAddView(pos, nextTop, true, mListPadding.left, selected);nextTop = child.getBottom() + mDividerHeight;if (selected) {selectedView = child;}pos++;}setVisibleRangeHint(mFirstPosition, mFirstPosition + getChildCount() - 1);return selectedView;}

重点看下: mSelectedPosition

    /*** Find a position that can be selected (i.e., is not a separator).** @param position The starting position to look at.* @param lookDown Whether to look down for other positions.* @return The next selectable position starting at position and then searching either up or*         down. Returns {@link #INVALID_POSITION} if nothing can be found.*/@Overrideint lookForSelectablePosition(int position, boolean lookDown) {final ListAdapter adapter = mAdapter;if (adapter == null || isInTouchMode()) {return INVALID_POSITION;}final int count = adapter.getCount();if (!mAreAllItemsSelectable) {if (lookDown) {position = Math.max(0, position);while (position < count && !adapter.isEnabled(position)) {position++;}} else {position = Math.min(position, count - 1);while (position >= 0 && !adapter.isEnabled(position)) {position--;}}}if (position < 0 || position >= count) {return INVALID_POSITION;}return position;}

鼠标的操作模式中, isInTouchMode 返回的是false, mSelectedPosition = 0;
当点击了列表项后, isInTouchMode 则返回了true, mSelectedPosition = INVALID_POSITION (-1)

解决回滚

一个取巧的办法: 在鼠标输入的模式下, 会导致View判断isInTouchMode返回false, 那么, 重写该判断方法即可.

package com.android.tester.widgets;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;public class XLV extends ListView {public XLV(Context context) {super(context);}public XLV(Context context, AttributeSet attrs) {super(context, attrs);}public XLV(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean isInTouchMode() {return true;}
}

 


 

设置列表项的背景: android:listSelector 和 android:background 的效果并不相同!

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="@color/red"/></shape></item><item android:state_focused="true"><shape><solid android:color="@color/yellow"/></shape></item><item android:state_checked="true"><shape><solid android:color="@color/cyan"/></shape></item><item android:state_selected="true"><shape><solid android:color="@color/blue"/></shape></item><item android:state_activated="true"><shape><solid android:color="@color/purple"/></shape></item><item><shape><solid android:color="@color/trans"/></shape></item>
</selector>

设置列表项的方法有两种, 实际效果却不相同:

android:listSelector 有自己的想法, 测试的代码中, 似乎它对 state_focused (黄色)相当执着, 即使列表项在View的状态已经是Selected, 它依然不变初衷.

从dumpsys可以看到:

    android.widget.LinearLayout{9af619f V.E...... ..S..... 0,0-1920,173}com.android.tester.widgets.XTV{f6532ec V.ED..... ..S..... 0,0-1735,173 #7f030004 app:id/tv}android.widget.Button{222c6b5 VFED..C.. ..S..... 1735,0-1920,173 #7f030000 app:id/btn}

显示效果:
在这里插入图片描述
 
 

为列表项单独设置android:background会更灵活一点

  //会残留黄色背景android:listSelector="@null"//背景干净.android:listSelector="@color/trans"

修改列表项背景:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:descendantFocusability="blocksDescendants"android:background="@drawable/selector_item_bg"android:layout_width="match_parent"android:layout_height="match_parent"><com.android.tester.widgets.XTV android:id="@+id/tv"android:layout_width="0dp"android:layout_weight="1"android:textColor="#FF987654"android:gravity="center_vertical"android:layout_height="match_parent"/><Button android:id="@+id/btn"android:text="BTN"android:padding="48dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>

参考代码

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><!--<TextView android:id="@+id/tvLeft"android:background="@drawable/selector_border_bg"android:layout_width="0dp"android:layout_weight="0.3"android:layout_height="wrap_content"/>--><com.android.tester.widgets.XLVandroid:id="@+id/lvRight"android:layout_width="match_parent"android:layout_height="match_parent"android:drawSelectorOnTop="false"android:cacheColorHint="@color/trans"android:listSelector="@null"/>
</LinearLayout>

layout item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:descendantFocusability="blocksDescendants"android:layout_width="match_parent"android:layout_height="match_parent"><com.android.tester.widgets.XTV android:id="@+id/tv"android:layout_width="0dp"android:layout_weight="1"android:textColor="#FF987654"android:gravity="center_vertical"android:layout_height="match_parent"/><Button android:id="@+id/btn"android:text="BTN"android:padding="48dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>

Activity

package com.android.tester.cases;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;import com.android.tester.R;import java.util.ArrayList;public class ListViewBackground extends Activity {final String TAG = "ListViewBackground";//TextView tvLeft;ListView lvRight;LVAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_background);/*tvLeft = (TextView) findViewById(R.id.tvLeft);tvLeft.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {lvRight.setSelection(0);}});*/lvRight = (ListView)findViewById(R.id.lvRight);lvRight.setChoiceMode(AbsListView.CHOICE_MODE_NONE);adapter = new LVAdapter();for(int i = 0; i < 50; i ++){adapter.addData("ITEM " + i);}lvRight.setAdapter(adapter);lvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {/*tvLeft.setText(adapter.content.get(position));tvLeft.setSelected(position%3 == 0);tvLeft.setPressed(position%2 == 0);*///lvRight.setSelection(position);}});}class LVAdapter extends BaseAdapter{ArrayList<Data> content = new ArrayList<>();void addData(String str){int pos = content.size();content.add(new Data());content.get(pos).content = str;content.get(pos).pos = pos;}@Overridepublic int getCount() {return content.size();}@Overridepublic Object getItem(int position) {return content.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TAG tag = null;if(convertView != null && convertView.getTag() != null){tag = (TAG)convertView.getTag();}else{tag = new TAG();convertView = getLayoutInflater().inflate(R.layout.layout_item_lv_background, null, false);tag.tv = convertView.findViewById(R.id.tv);tag.btn = convertView.findViewById(R.id.btn);tag.btn.setOnClickListener(btnClick);convertView.setTag(tag);}tag.tv.setText(content.get(position).content);tag.btn.setTag(position);//convertView.setSelected(content.get(position).selected);return convertView;}View.OnClickListener btnClick = new View.OnClickListener() {@Overridepublic void onClick(View v) {int pos = (int)v.getTag();//tvLeft.setText("Click Button " + pos);Log.d(TAG, "onClick isItemChecked=" + lvRight.isItemChecked(pos));Log.d(TAG, "onClick selected item pos=" + lvRight.getSelectedItemPosition());//lvRight.setSelection(pos);//lvRight.setItemChecked(pos, true);//content.get(pos).selected = true;notifyDataSetChanged();}};class TAG{TextView tv;Button btn;}class Data{int pos;boolean selected;String content;}}
}

XLV.java

package com.android.tester.widgets;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;public class XLV extends ListView {public XLV(Context context) {super(context);}public XLV(Context context, AttributeSet attrs) {super(context, attrs);}public XLV(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean isInTouchMode() {return true;}
}

参考

ListView的多选单选模式
listview的属性listselector使用解析

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

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

相关文章

【ML Olympiad】预测地震破坏——根据建筑物位置和施工情况预测地震对建筑物造成的破坏程度

文章目录 Overview 概述Goal 目标Evaluation 评估标准 Dataset Description 数据集说明Dataset Source 数据集来源Dataset Fields 数据集字段 Data Analysis and Visualization 数据分析与可视化Correlation 相关性Hierarchial Clustering 分层聚类Adversarial Validation 对抗…

OFDM通信中的部分内容

纠错编码&#xff1a;在无线通信过程中由于传输过程存在噪声等各种非理想因素&#xff0c;在接收端接收到的信息往往相对于发射信息存在误码&#xff0c;通过纠错编码方式可以对少数非连续的误码进行判断和纠正。举个简单的例子&#xff0c;发射端可能发射的信息为00,01,10,11,…

二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列 背景题目描述题解 背景 每次重复刷到这题都没有思路,看答案也总需要理解一会,但是下次又忘了,哈哈哈,因此记录一下思路. 题目描述 牛客地址&#xff1a; https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd 描述 输入一个整数数…

网络应用层之(1)DHCPv6协议

网络应用层之(1)DHCPv6协议 Author: Once Day Date: 2024年5月26日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-C…

如何从头搭建一个自己的java库并上传到maven官方仓库

创建代码 在代码库根目录执行maven命令&#xff0c;用于快速生成一个基础的Maven项目 mvn archetype:generate \-DgroupIdcom.mycompany \-DartifactIdmy-maven-project \-Dversion1.0.0 \-DarchetypeArtifactIdmaven-archetype-quickstart \-DinteractiveModefalse 这个命令…

分享一个用AI降本的思路,不懂代码也能上手

如何用AI解决实际的业务问题&#xff1f; 生财圈友我来利用ChatGPT做算法建模&#xff0c;每年为公司省下6万元。 今天他将分享通过ChatGPT进行数据分析的思路&#xff0c;从最开始定义问题到最终数据论证。 上手的实操过程门槛并不高&#xff0c;但可以实现把官方电商平台的…

c++ 虚函数常见问题

1 虚函数&#xff0c;虚表基础 虚函数&#xff0c;虚表基础 2 虚函数表保存在哪里 ? 虚函数表在编译的时候确定。在 linux 下&#xff0c;保存在只读数据段的重定位段&#xff0c;这个段的名字是 .data.rel.ro。 如下代码&#xff0c;编译之后&#xff0c;使用 readelf -t a…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称&#xff1a;仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称&#xff1a;仿《Q极速体育》NBACBA体育直…

网络攻防概述(基础概念)

文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性&#xff08;Availability&#xff09;不可否认性&#xff08;Non-repudiation&#xf…

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频&#xff1a; 这里我推荐中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络&#xff08;自顶向下方法&#xff09;》&#xff0c;授课风格更偏向实…

企业如何正确地利用LLM大模型?

大型语言模型 (LLM) 不值得信任。就是这样。 考虑到它们先进的 AI 能力以及当今强大的基础模型的普遍知识&#xff0c;这似乎是一件令人惊讶的事情。然而&#xff0c;问题的关键在于 LLM 无法解释其输出。你不能信任 LLM 的结果&#xff0c;不是因为它不准确&#xff0c;而是因…

无畏并发: Rust Mutex的基本使用

并发是很多编程语言避不开的一块主要内容&#xff0c;主打一个无畏并发的Rust自然也面临这样的挑战。Rust中的Mutex提供了强大的同步原语&#xff0c;确保共享数据的线程安全&#xff0c;这篇文章中&#xff0c;我们会探讨Mutex的使用&#xff0c;从基础的用法到一些高阶内容。…

2024电工杯B题平衡膳食食谱的优化设计及评价原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024电工杯数学建模B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 10 一、问题重述 14 二&#xff0e;问题分析 …

Python学习---基于HTTP的服务端基础框架搭建案例

整体功能&#xff1a; 1 创建框架构建相关的文件夹 2 创建app,模块文件 3 在 app模块文件中创建application函数(用于处理请求) 4 将request_handler()中的处理逻辑交由app模块的application函数完成 5 app模块的 application函数返回响应报文 6 在application 文件夹中创建一个…

淘工厂订单导出自动化工具

目录 下载安装与运行 主要目的 其他工具的弊端 本工具的优势 视频演示 下载新版后的注意事项 支持的导出项 什么叫一单多拍 常见问题 如何实现快捷登录 导出卡住时如何操作 如何精确导出 下载安装与运行 下载、安装与运行 语雀 主要目的 导出订单信息&#xf…

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…

某钢铁企业数字化转型规划案例(114页PPT)

案例介绍&#xff1a; 该钢铁企业的数字化转型案例表明&#xff0c;数字化转型是钢铁企业应对市场竞争、提高生产效率、降低成本、优化资源配置和降低能耗排放的重要手段。通过引入先进的技术和管理理念&#xff0c;加强员工培训和人才引进&#xff0c;企业可以成功实现数字化…

欢乐钓鱼大师游戏攻略:自动钓鱼技巧!

《欢乐钓鱼大师》是一款极具趣味性和挑战性的钓鱼模拟游戏&#xff0c;为玩家提供了一个体验钓鱼乐趣的虚拟世界。从湖泊到河流&#xff0c;再到广袤的海洋&#xff0c;游戏中的各种钓场让人流连忘返。无论是新手钓友&#xff0c;还是经验丰富的老钓手&#xff0c;都可以在游戏…

k8s集群中pod的容器资源限制和三种探针

一、资源限制 总结&#xff1a; requests表示创建pod时预留的资源&#xff0c;limits表示pod能够使用资源的最大值。requests值可以被超&#xff0c;limits值不能超过&#xff0c;如果是内存使用超过limits会触发oom然后杀掉进程&#xff0c;如果是cpu超过limits会压缩cpu的使用…

20.SkyWalking

一.简介 SkyWalking用于应用性能监控、分布式链路跟踪、诊断&#xff1a; 参考连接如下&#xff1a; https://github.com/apache/skywalking https://skywalking.apache.org/docs/ 二.示例 通过官网连接进入下载页面&#xff1a;https://archive.apache.org/dist/skywalkin…