Android学习——Adapter适配器

2023-11-12

AdapterView:

容器控件,其整体效果由每一个子元素内容决定,子元素的形式由Adapter决定。

AdapterView的子视图对象:

ListView:以垂直滑动列表形式显示一组数据。

GridView:以网格形式显示一组数据。

Spinner:以下拉列表形式显示一组数据。

Gallery:以水平滑动列表形式显示一组数据。(此类已弃用,由HorizontalScrollView和ViewPager代替 

Adapter:

数据和视图之间交互的中介

Android中的常用Adapter

ArrayAdapter:最简单的适配器,数据源为文本字符串数组。

SimpleAdapter:简单适配器,数据源结构比较复杂,一般为List<Map>类型对象。 SimpleCursorAdapter:游标适配器,数据源一般为数据库中的数据。

自定义适配器:更灵活的适配器,数据源不定(由用户自行指定),需要继承BaseAdapter抽象类。

代码示例:

ArrayAdapter:

只能展示一行文字的最简单的adapter

使用:

activity_array_adapter:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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=".arrayAadapter.ArrayAdapterActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/list_array"/>

</LinearLayout>

ArrayAdapterActivity:

package com.example.ch0203adapter.arrayAadapter;
/*
* 只能展现一行文字
* */
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.ch0203adapter.R;

import java.util.ArrayList;
import java.util.List;

public class ArrayAdapterActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_array_adapter);

        //提供数据
//        String[] strs = {"A","B","C","D","E"};
        //创建ArrayAdapter
//        ArrayAdapter<String> adapter = new ArrayAdapter<String>
//                (this,android.R.layout.simple_expandable_list_item_1,strs);
//      支持泛型 数据源
        List<String> data = new ArrayList<String>();
        data.add("A");
        data.add("B");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_expandable_list_item_1,data);
//        simple_expandable_list_item_1系统提供的listview模板


        //获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
        ListView list_test = (ListView) findViewById(R.id.list_array);
        list_test.setAdapter(adapter);
        //        绑定事件监听器
        list_test.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.e("ArrayAdapter","点击了" + position + "条");
            }
        });
    }
}

效果:

simpleAdapter:

1、自定义子项布局文件

simple_list_item:子项布局

<?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:orientation="horizontal">

    <!-- 定义一个用于显示头像的ImageView -->
    <ImageView
        android:id="@+id/imgtou"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:baselineAlignBottom="true"
        android:paddingLeft="8dp" />

    <!-- 定义一个竖直方向的LinearLayout,显示姓名和身份-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="8dp"
            android:textColor="#1D1D1C"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/says"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="8px"
            android:textColor="#B4B4B9"
            android:textSize="14sp" />

    </LinearLayout>

</LinearLayout>
activity_simple_adapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <ListView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_simple"/>

</RelativeLayout>
SimpleAdapterActivity:
package com.example.ch0203adapter.simpleAdapter;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.example.ch0203adapter.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleAdapterActivity extends AppCompatActivity {

//    数据源
private String[] names = new String[]{"A", "B", "C"};
    private String[] says = new String[]{"同学", "老师", "教导主任"};
    private int[] imgIds = new int[]{R.drawable.head_icon1, R.drawable.head_icon1, R.drawable.head_icon1};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_adapter);
        List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < names.length; i++) {
            Map<String, Object> showitem = new HashMap<String, Object>();
            showitem.put("touxiang", imgIds[i]);
            showitem.put("name", names[i]);
            showitem.put("says", says[i]);
            listitem.add(showitem);
        }

        //创建一个simpleAdapter
        SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.simple_list_item, new String[]{"touxiang", "name", "says"}, new int[]{R.id.imgtou, R.id.name, R.id.says});
        ListView listView = (ListView) findViewById(R.id.list_simple);
        listView.setAdapter(myAdapter);
    }
}

效果:

2、使用内置子项布局文件

activity_simple_adapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <ListView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_simple"/>

</RelativeLayout>
SimpleAdapterActivity:
package com.example.ch0203adapter.simpleAdapter;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.example.ch0203adapter.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleAdapterActivity extends AppCompatActivity {
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_adapter);

        
        /*使用内置子项布局文件*/
//准备数据源
List<Map<String,String>> students = new ArrayList<>();
    Map<String,String> stu1 = new HashMap<>();
        stu1.put("name", "张三");
        stu1.put("no","2019010200");
        students.add(stu1);
    Map<String,String> stu2 = new HashMap<>();
        stu2.put("name", "李四");
        stu2.put("no","2019010201");
        students.add(stu2);
    //item布局文件(内置的)
    //创建Adapter对象
    SimpleAdapter simpleAdapter = new SimpleAdapter(this,
            students,//显示的数据源
            android.R.layout.simple_list_item_2,//item的布局文件
            new String[]{"name","no"},//Map中的需要显示的数据的key值
            new int[]{android.R.id.text1,android.R.id.text2});//显示数据的控件的id值
    //获取ListView并绑定Adapter
    ListView listView = findViewById(R.id.list_simple);
        listView.setAdapter(simpleAdapter);
    //绑定事件监听器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //点击ListView每一个item都会执行
            //parent当前的AdapterView对象(ListView对象)
            //view当前点击的item的视图对象
            //position用户当前点击的位置下标,从0开始
            //id值通常同position值一致
            Log.e("ListView","点击的位置"+position
                    +" 姓名:" + students.get(position).get("name"));
            //点击某一条时,修改当前item视图的背景颜色
            view.setBackgroundColor(getResources().getColor(R.color.purple_200));
        }
    });
}
}

效果:

自定义Adapter

ListView:

以垂直可滑动列表形式显示子项目的视图容器,是一种AdapterView。

ListView使用的基本流程:

准备ListView每一个子项的视图布局。 可以使用内置的布局,也可以用户自定义布局。

创建Adapter(连接数据源和视图布局)。

为ListView绑定Adapter。

为ListView绑定事件监听器。

代码示例:

student_list_item:  自定义每一个listitem布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="150dp"
        android:layout_height="150dp"/>
    <LinearLayout
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@id/iv_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tv_no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25sp"/>
    </LinearLayout>
    <ImageView
        android:id="@+id/iv_delete"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginRight="20dp"
        android:layout_alignParentRight="true"
        android:src="@drawable/delete"/>
</RelativeLayout>

CustomerAdapter: 自定义Adapter需要继承BaseAdapter

package com.example.ch0203adapter.customerListAdapter;


import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.ch0203adapter.R;

import java.util.ArrayList;
import java.util.List;

/*
功能:将数据源同item布局绑定
 */
public class CustomAdapter extends BaseAdapter {
    private List<Student> students = new ArrayList<>();
    private int layoutResId;
    private Context context;//环境上下文

    public CustomAdapter(Context context, List<Student> students,
                         int layoutResId){
        this.context = context;
        this.students = students;
        this.layoutResId = layoutResId;
    }

    @Override
    //获取数据源数据条数
    public int getCount() {
        if (null != students){
            return students.size();
        }
        return 0;
    }

    @Override
    //返回每一个item显示的数据对象
    public Object getItem(int position) {
        if (null != students){
            return students.get(position);
        }
        return null;
    }

    @Override
    //返回每一个item的id的值
    public long getItemId(int position) {
        return position;
    }

    @Override
    //生成每个item的视图对象(最重要)
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            //加载item的布局文件
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            convertView = layoutInflater.inflate(layoutResId, null, false);
        }
        //在布局文件的控件中显示数据
        //获取控件对象的引用
        ImageView imageView = convertView.findViewById(R.id.iv_photo);
        TextView tvName = convertView.findViewById(R.id.tv_name);
        TextView tvNo = convertView.findViewById(R.id.tv_no);
        ImageView ivDelete = convertView.findViewById(R.id.iv_delete);

        //设置控件显示的内容
        tvName.setText(students.get(position).getStuName());
        tvNo.setText(students.get(position).getStuNo());
        //设置ImageView显示的图片
        imageView.setBackgroundResource(students.get(position).getPhotoId());
        //处理控件的点击事件
        ivDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //删除数据源中的一条数据
                students.remove(position);
                //刷新界面(更新Adapter)
                notifyDataSetChanged();
            }
        });
        return convertView;
    }
}

ListActivity: 实现绑定

package com.example.ch0203adapter.customerListAdapter;
/*
* 自定义ListView  学生列表
* */
/*
* 准备ListView每一个子项的视图布局。可以使用内置的布局,也可以用户自定义布局。
*创建Adapter(连接数据源和视图布局)。
*为ListView绑定Adapter。
*为ListView绑定事件监听器。
*/
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import com.example.ch0203adapter.R;



import java.util.ArrayList;
import java.util.List;

public class ListActivity extends AppCompatActivity {
    private List<Student> students = new ArrayList<>();
    private CustomAdapter customAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        //准备数据源
        initData();
        //自定义item的布局文件 student_list_item
        //初始化ListView,绑定Adapter
        initListView();
        initButton();
    }
    public void initData(){
        Student stu1 = new Student("张三","2019001200",R.drawable.boy);
        Student stu2 = new Student("李四","2019001202",R.drawable.girl);
        Student stu3 = new Student("张三","2019001200",R.drawable.boy);
        Student stu4 = new Student("李四","2019001202",R.drawable.girl);
        Student stu5 = new Student("李四","2019001202",R.drawable.girl);
        students.add(stu1);
        students.add(stu2);
        students.add(stu3);
        students.add(stu4);
        students.add(stu5);
    }
    public void initListView(){
        ListView listView = findViewById(R.id.lv_student);
        customAdapter = new CustomAdapter(
                this,
                students,
                R.layout.student_list_item);
//        绑定Adapter
        listView.setAdapter(customAdapter);
//        绑定事件监听器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.e("自定义Adapter","点击了" + position + "条");
            }
        });
    }
//    添加按钮点击事件
    public void initButton(){
        Button btnAdd = findViewById(R.id.btn_add);
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在数据源中添加一条数据
                Student stu1 = new Student("王五","2019001202",R.drawable.boy);
                students.add(stu1);
                //更新界面
                customAdapter.notifyDataSetChanged();
            }
        });
    }
}

activity_list:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <ListView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lv_student"/>
    <Button
        android:id="@+id/btn_add"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加"/>
</RelativeLayout>

Student:学生实体类

package com.example.ch0203adapter.customerListAdapter;

public class Student {
    private String stuName;
    private String stuNo;
    private int photoId;

    public Student() {
    }

    public Student(String stuName, String stuNo, int photoId) {
        this.stuName = stuName;
        this.stuNo = stuNo;
        this.photoId = photoId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public int getPhotoId() {
        return photoId;
    }

    public void setPhotoId(int photoId) {
        this.photoId = photoId;
    }
}

效果:

GridView网格列表

activity_grid:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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=".customerGridView.GridActivity">

    <GridView
        android:id="@+id/lv_students"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="2" />
<!--每行两个子项-->

</RelativeLayout>

GridActivity:

package com.example.ch0203adapter.customerGridView;

/*
* 与ListView相同
* 网格列表展示学生
* */
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.example.ch0203adapter.R;
import com.example.ch0203adapter.customerListView.CustomAdapter;
import com.example.ch0203adapter.Student;

import java.util.ArrayList;
import java.util.List;

public class GridActivity extends AppCompatActivity {
    private List<Student> students = new ArrayList<>();
    private CustomAdapter customAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grid);

        //准备数据源
        initData();
        //自定义item的布局文件 student_list_item
        //初始化ListView,绑定Adapter
        initListView();
    }
    public void initData(){
        Student stu1 = new Student("张三","2019",R.drawable.boy);
        Student stu2 = new Student("李四","2012",R.drawable.girl);
        Student stu3 = new Student("张三","2010",R.drawable.boy);
        Student stu4 = new Student("李四","2020",R.drawable.girl);
        Student stu5 = new Student("李四","2012",R.drawable.girl);
        students.add(stu1);
        students.add(stu2);
        students.add(stu3);
        students.add(stu4);
        students.add(stu5);
    }
    public void initListView(){
        ListView listView = findViewById(R.id.lv_student);
        customAdapter = new CustomAdapter(
                this,
                students,
                R.layout.student_list_item);
//        绑定Adapter
        listView.setAdapter(customAdapter);
//        绑定事件监听器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.e("自定义Adapter","点击了" + position + "条");
            }
        });
    }

}

MyAdapter

package com.example.ch0203adapter.customerGridView;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public abstract class MyAdapter<T> extends BaseAdapter {

    private ArrayList<T> mData;
    private int mLayoutRes;           //布局id


    public MyAdapter() {
    }

    public MyAdapter(ArrayList<T> mData, int mLayoutRes) {
        this.mData = mData;
        this.mLayoutRes = mLayoutRes;
    }

    @Override
    public int getCount() {
        return mData != null ? mData.size() : 0;
    }

    @Override
    public T getItem(int position) {
        return mData.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes
                , position);
        bindView(holder, getItem(position));
        return holder.getItemView();
    }

    public abstract void bindView(ViewHolder holder, T obj);

    //添加一个元素
    public void add(T data) {
        if (mData == null) {
            mData = new ArrayList<>();
        }
        mData.add(data);
        notifyDataSetChanged();
    }

    //往特定位置,添加一个元素
    public void add(int position, T data) {
        if (mData == null) {
            mData = new ArrayList<>();
        }
        mData.add(position, data);
        notifyDataSetChanged();
    }

    public void remove(T data) {
        if (mData != null) {
            mData.remove(data);
        }
        notifyDataSetChanged();
    }

    public void remove(int position) {
        if (mData != null) {
            mData.remove(position);
        }
        notifyDataSetChanged();
    }

    public void clear() {
        if (mData != null) {
            mData.clear();
        }
        notifyDataSetChanged();
    }


    public static class ViewHolder {

        private SparseArray<View> mViews;   //存储ListView 的 item中的View
        private View item;                  //存放convertView
        private int position;               //游标
        private Context context;            //Context上下文

        //构造方法,完成相关初始化
        private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
            mViews = new SparseArray<>();
            this.context = context;
            View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false);
            convertView.setTag(this);
            item = convertView;
        }

        //绑定ViewHolder与item
        public static ViewHolder bind(Context context, View convertView, ViewGroup parent,
                                      int layoutRes, int position) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder(context, parent, layoutRes);
            } else {
                holder = (ViewHolder) convertView.getTag();
                holder.item = convertView;
            }
            holder.position = position;
            return holder;
        }

        @SuppressWarnings("unchecked")
        public <T extends View> T getView(int id) {
            T t = (T) mViews.get(id);
            if (t == null) {
                t = (T) item.findViewById(id);
                mViews.put(id, t);
            }
            return t;
        }


        /**
         * 获取当前条目
         */
        public View getItemView() {
            return item;
        }

        /**
         * 获取条目位置
         */
        public int getItemPosition() {
            return position;
        }

        /**
         * 设置文字
         */
        public ViewHolder setText(int id, CharSequence text) {
            View view = getView(id);
            if (view instanceof TextView) {
                ((TextView) view).setText(text);
            }
            return this;
        }

        /**
         * 设置图片
         */
        public ViewHolder setImageResource(int id, int drawableRes) {
            View view = getView(id);
            if (view instanceof ImageView) {
                ((ImageView) view).setImageResource(drawableRes);
            } else {
                view.setBackgroundResource(drawableRes);
            }
            return this;
        }


        /**
         * 设置点击监听
         */
        public ViewHolder setOnClickListener(int id, View.OnClickListener listener) {
            getView(id).setOnClickListener(listener);
            return this;
        }

        /**
         * 设置可见
         */
        public ViewHolder setVisibility(int id, int visible) {
            getView(id).setVisibility(visible);
            return this;
        }

        /**
         * 设置标签
         */
        public ViewHolder setTag(int id, Object obj) {
            getView(id).setTag(obj);
            return this;
        }

        //其他方法可自行扩展

    }

}

Student类同ListView

效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android学习——Adapter适配器 的相关文章

随机推荐

  • hihocoder #1000 : A + B Java实现

    时间限制 1000ms 单点时限 1000ms 内存限制 256MB 描述 求两个整数A B的和 输入 输入包含多组数据 每组数据包含两个整数A 1 A 100 和B 1 B 100 输出 对于每组数据输出A B的和 样例输入 1 2 3
  • 子序列问题

    子序列问题 双指针 动态规划 例题一 判断子序列 力扣392 链接 https leetcode cn com problems is subsequence 题目描述 给定字符串 s 和 t 判断 s 是否为 t 的子序列 字符串的一个子
  • 如何在Power Linux上运行AIX程序(实现验证,附源码开源地址)

    最后更新2021 01 21 静心研究了小半年 终于把原型验证搞定了 可以在Power Linux上直接运行AIX程序 当然 目前只是实现了POC 还有大量的工程工作 源代码地址 https gitee com HarryHurryHung
  • 不用==用equals引发的一系列思考

    毕业刚工作的时候 带我的小师傅给我说判断相等使用equals不要使用 第一次写java的我照办了 但是不清楚为什么 之后还是决定真正了解一下java本身 于是开始看jdk源码 这里以Integer为例 equal public boolea
  • 【Python】多分类算法—Random Forest

    Python 多分类算法 Random Forest 本文将主要就Random Forest 随机森林 的多分类应用进行描述 当然也可运用于二分类中 本文运用scikit learn框架 文章目录 Python 多分类算法 Random F
  • docker私有仓库

    一 docker私有仓库 1 拉取 docker pull registry 2 创建启动容器 docker run id name registry p 5000 5000 registry 3 浏览器输入地址 http ip 5000
  • 【Java】操作Sqlite数据库

    首先在https github com xerial sqlite jdbc下载jar包 import java sql Connection import java sql DriverManager import java sql Re
  • 01Linux常用指令

    所有的指令不要强制记忆 选项要多多查一下 多多练习使用即可 文章目录 一 Linux简单介绍 1 1 Linux的目录结构 1 2 常见的具体目录结构 bin sbin root lib etc usr boot tmp dev media
  • 从字符串中取出指定位置的字符

    首先肯定返回一个char类型
  • excel编写的测试用例转成xmind格式

    软件开发过程中 测试工程师必不可少的一项工作就是编写测试用例 进行测试评审 设计评审 用例评审 写用例常用的几种方法无非就是用excel写 或者xmind这种思维导图形式 而xmind具有条理清晰的特点 所以测试评审时为了提高效率 很多团队
  • 2023华为od机试 Python【不包含回文串】

    前言 本题使用python解答 如果需要Java版本代码 请参考 点我 题目 什么是回文串呢 就是将原字符串翻转过来 和原始字符串一样的字符串 我们现在有一个不包含回文串的字符串 并且 字符串的字符在英语字母的前N个 且字符串不包含任何长度
  • 【网络游戏同步技术】帧同步的一致性

    参考博文 GAD 网络游戏同步技术 引言 帧同步的形式很泛 根据不同游戏 使用的技术范围又不一样 所以大家都在讲方法论 要全面覆盖可能需要较大的篇幅 所以 我简单描述下 假定大家对帧同步和状态同步有一定的认识 理论上的问题 我就不作过多解释
  • 从pandas dataframe中随机删除n个某一列是某个值的元素

    从pandas dataframe中随机删除n个某一列是某个值的元素 import pandas as pd 创建示例 DataFrame data A 1 2 3 4 5 6 B 6 7 8 9 10 11 C X Y Z X Y X d
  • 基本排序算法(直接排序,选择排序,冒泡排序)

    一 直接排序 思路 首先需要两个嵌套的for循环 外层for循环控制轮数 内层for循环控制每轮比较的次数 这里来演示一下遍历的过程 第一轮 首先让i指向数组的首部 让j指向i的后一个元素 两者比较 2比1大 所以交换2跟1的位置 然后j后
  • git proxy

    git config global https proxy http 127 0 0 1 7890 git config global https proxy https 127 0 0 1 7890
  • tar命令的详细解释

    tar命令 root linux tar cxtzjvfpPN 文件与目录 参数 c 建立一个压缩文件的参数指令 create 的意思 x 解开一个压缩文件的参数指令 t 查看 tarfile 里面的文件 特别注意 在参数的下达中 c x
  • CSS 水平居中

    1 若元素内容为文字时 元素设置text align center text align属性指定元素文本的水平对齐方式 center 把文本排列到中间 p 这里是文本内容 p 2 父子元素宽度固定 父元素设置text align cente
  • SQL实用功能手册

    SQL实用功能手册 SQL基础复习 SQL结构化查询语言 是一种访问和处理数据库的计算机语言 对数据库操作 对表操作 对数据进行CRUD操作 操作视图 存储过程 索引 环境基础操作 安装mysql 启动mysql 配置环境变量 检查mysq
  • 搞懂java类加载机制和类加载器

    搞懂java类加载机制和类加载器 类加载概述 一个类从被加载到虚拟机内存中开始 到卸载出内存为止 它的整个生命周期将会经历加载 验证 准备 解析 初始化 使用和卸载七个阶段 其中验证 准备 解析三个部分统称为连接 如下图所示 其中加载 验证
  • Android学习——Adapter适配器

    AdapterView 容器控件 其整体效果由每一个子元素内容决定 子元素的形式由Adapter决定 AdapterView的子视图对象 ListView 以垂直滑动列表形式显示一组数据 GridView 以网格形式显示一组数据 Spinn