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: setSelected
   at 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.
     */
    @Override
    int 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);
    }

    @Override
    public 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.XLV
        android: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;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_background);
        /*tvLeft = (TextView) findViewById(R.id.tvLeft);
        tvLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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() {
            @Override
            public 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;

        }
        @Override
        public int getCount() {
            return content.size();
        }

        @Override
        public Object getItem(int position) {
            return content.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public 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() {
            @Override
            public 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);
    }

    @Override
    public boolean isInTouchMode() {
        return true;
    }
}

参考

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言IO

前言 老是忘记c语言IO操作&#xff0c;故写个文章记录一下 打开文件 fopen FILE *fopen(const char *path, const char *mode);mode 返回值 如果文件成功打开&#xff0c;fopen 返回一个指向 FILE 结构的指针。如果文件打开失败&#xff08;例如&#xff0c;因为文件不存…

CMS Full GC流程以及调优配置

个人博客 CMS Full GC流程以及调优配置 | iwts’s blog CMS CMS 收集器是以实现最短 STW 时间为目标的收集器&#xff0c;所以对于偏业务的后台开发而言&#xff0c;基本上都无脑选CMS了。 多线程收集器&#xff0c;工作在老年代&#xff0c;采用标记清除算法。比较特殊&am…

leetcode-顺时针旋转矩阵-111

题目要求 思路 1.假设现在有一个矩阵 123 456 789 2.我们可以根据19这个对角线将数据进行交换&#xff0c;得到矩阵 147 258 369 3.然后将矩阵每一行的数据再翻转&#xff0c;得到矩阵 741 852 963 代码实现 class Solution { public:vector<vector<int> > rot…

贪心-ACW803区间合并-XMUOJ力量碎片合并

题目 思路 附上几个参考链接 for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 C pair的基本用法总结&#xff08;整理&#xff09;_c pair用法-CSDN博客 使用 sort 实现自定义排序 - AcWing 话不多说&#xff0c;直接上代码 代码 /* ACW803区间合并-XMUOJ力量碎片合…

【C++】二分查找算法:x的平方根

1.题目 2.算法思路 看到题目可能不容易想到二分查找。 这题考察我们对算法的熟练程度。 二分查找的特点&#xff1a;数组具有二段性(不一定有序)。 题目中没有数组&#xff0c;我们可以造一个从0到x的数组&#xff0c;然后利用二分查找找到对应的值即可。 3.代码 class S…

Android 布局中@NULL的使用和代码实现方式详解

文章目录 1、使用场景2、示例代码实现2.1、移除背景2.2 、移除文本2.3、移除布局宽度或高度2.4、移除提示文本2.5、移除图像资源 3、综合示例3.1、布局文件 activity_main.xml3.2、主活动文件 MainActivity.java3.4、资源文件3.5、运行结果 4、优点5、缺点6、综合分析6.1、适用…

MySQL数据库基础:使用、架构、SQL语句、存储引擎

文章目录 什么是数据库CS模式 基本使用安装链接服务器服务器、数据库、表关系简单使用数据库在Linux下的体现 MySQL架构连接器层客户端层服务层存储引擎层物理存储层 SQL分类存储引擎 什么是数据库 mysql&#xff1a;数据库服务的客户端mysqld&#xff1a;数据库服务的服务器端…

BGP策略实验(路径属性和选路规则)

要求&#xff1a; 1、使用preval策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2到达19…

移动云以深度融合之服务,令“大”智慧贯穿云端

移动云助力大模型&#xff0c;开拓创新领未来。 云计算——AI模型的推动器。 当前人工智能技术发展的现状和趋势&#xff0c;以及中国在人工智能领域的发展策略和成就。确实&#xff0c;以 ChatGPT 为代表的大型语言模型在自然语言处理、文本生成、对话系统等领域取得了显著的…

深度学习中的多GPU训练(Pytorch 20)

一 多GPU训练 下面详细介绍如何从零开始并行地训练网络&#xff0c;这里需要运用小批量随机梯度下降算法。后面我还讲介绍如何使用高级API并行训练网络。 我们从一个简单的计算机视觉问题和一个稍稍过时的网络开始。这个网络有多个卷积层和汇聚层&#xff0c;最后可能 有几个…

构建智慧科技园区的系统架构:数字化驱动未来创新

随着科技的不断进步和数字化转型的加速推进&#xff0c;智慧科技园区已成为当今城市发展的重要组成部分。在智慧科技园区建设中&#xff0c;系统架构的设计和实施至关重要&#xff0c;对于提升园区管理效率、优化资源利用、促进创新发展具有重要意义。 一、智慧科技园区系统架构…

数据结构和算法|排序算法系列(三)|插入排序(三路排序函数std::sort)

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.4 插入排序 插入排序的整个过程与手动整理一副牌非常相似。 我们在未排序区间选择一个基准元素&#xff0c;将…

中国人工智能大模型价格战

近年来&#xff0c;人工智能技术迅猛发展&#xff0c;尤其是大模型领域的突破让人们看到了更多的可能性。然而&#xff0c;在这一高科技领域&#xff0c;中美两国的竞争日趋激烈。近日&#xff0c;中国互联网巨头们纷纷启动大模型价格战&#xff0c;引发了广泛关注。这场价格战…

GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI

LLaMA 模型的第三代&#xff0c;是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数&#xff0c;训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…

解决word里加入mathtype公式后行间距变大

1.布局>页面设置>文档网格&#xff0c;网格栏选为无网格 2.固定间距

CentOS Stream 9 vsftpd本地用户设置

1、使用yum指令下载vsftpd yum install vsftpd2、创建wu用户&#xff0c;为ftp组的成员 useradd -g ftp wu3、设置一个密码 echo 1 |passwd --stdin wu4、修改本地用户目录的权限&#xff08;所有者为wu用户&#xff09; chown -R wu /data/wu5、创建本地用户的信息数据存放…

领导VS管理:技术团队掌舵者的双重角色解析

文章目录 引言一、管理1.1 管理的定义1.2 管理的特点1.3 管理的作用 二、领导2.1 领导的定义2.2 领导的特点2.3 领导的作用 三、管理与领导的互补性3.1 互补策略 总结 引言 在科技飞速发展的今天&#xff0c;技术团队作为推动企业创新的核心力量&#xff0c;其管理显得尤为关键…

Quartus Cyclone I II III IVE 器件型号

玩耍了一个 EP2 型号的开发板&#xff0c;发现 安装的quartus13 没有Cyclone II 型号&#xff0c;经过探索发现了是版本不对。 https://www.intel.com/content/www/us/en/software-kit/711920/intel-quartus-ii-subscription-edition-design-software-version-13-0sp1-for-win…

3、xss-labs之lecel3

1、测试 开始页面&#xff0c;传入<script>alert(1)</script>&#xff0c;不出意外没有弹窗 2、按住CTRLU&#xff0c;查看返回的前端代码 3、看后端源码 htmlspecialchars() 是一个 PHP 函数&#xff0c;用于将特殊字符转换为 HTML 实体。比如 & &#xff08…

aws eks中amazonlinux2023版本节点加入集群逻辑变更的测试

基于amazonlinux2023的EKS优化AMI相关更新如下 引入yaml文件进行节点的初始化配置 需要VPC CNI v1.16.2及以上版本 可配置实例存储将自动挂载为 raid0 需要IMDSv2 使用cgroupv2 从userdata到nodeadm AL2中节点需要通过bootstrap.sh脚本执行节点的初始化逻辑&#xff0c;…