总结是一种习惯,不能停,一停人就懒了,都快一个月没有写了!该提提神了!

进入正题:android 仿微信联系人 首字母快速索引,先用下美团的索引效果图:


1、自定义View字母索引栏(右边那一列):
public class QuickIndexBar extends View {private final String[] LETTERS = new String[]{"↑", "#", "A", "B", "C", "D", "E", "F","G", "H", "I", "J", "K", "L", "M", "N","O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z"};//画笔private Paint mPaint;//单元格高private float cellHeight;//单元格宽private float cellWidth;private OnLetterUpdateListener mOnLetterUpdateListener;/*** 设置字母监听** @param onLetterUpdateListener*/public void setOnLetterUpdateListener(OnLetterUpdateListener onLetterUpdateListener) {mOnLetterUpdateListener = onLetterUpdateListener;}public QuickIndexBar(Context context) {this(context, null);}public QuickIndexBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public QuickIndexBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//去锯齿mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.DKGRAY);//粗体mPaint.setTypeface(Typeface.DEFAULT_BOLD);}@Overrideprotected void onDraw(Canvas canvas) {for (int i = 0; i < LETTERS.length; i++) {String text = LETTERS[i];//计算xy坐标//获取文本的宽度mPaint.measureText(text)int x = (int) (cellWidth / 2.0f - mPaint.measureText(text) / 2.0f);//获取文本的高度Rect rect = new Rect();//文本所在的矩形,创建空矩形mPaint.getTextBounds(text, 0, text.length(), rect);//填充文本int textHeight = rect.height();//获取文本高度int y = (int) (cellHeight / 2.0f + textHeight / 2.0f + cellHeight * i);<span style="color:#ff0000;"> //当字母被选中,使用不同颜色画出来,根据需求改变画笔的属性就可以了if (i == touchIndex){mPaint.setColor(Color.GREEN);mPaint.setFakeBoldText(true);}</span>canvas.drawText(LETTERS[i], x, y, mPaint);<span style="color:#ff0000;"> mPaint.reset();</span>}}/*** This is called during layout when the size of this view has changed. If* you were just added to the view hierarchy, you're called with the old* values of 0.** @param w    Current width of this view.* @param h    Current height of this view.* @param oldw Old width of this view.* @param oldh Old height of this view.*/@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);//测量出view的宽cellWidth = getMeasuredWidth();//测量view高度除以格子总数cellHeight = getMeasuredHeight() / LETTERS.length;}<span style="color:#ff0000;"> /**</span>
<span style="color:#ff0000;">    * 这段代码实现外部列表滑动时,监听可视首项改变,用来改变画笔颜色进行突出</span>
<span style="color:#ff0000;">    */</span>
    <span style="color:#ff0000;">//被选中项int touchIndex = -1;public int getTouchIndex() {return touchIndex;}//设置被选中项public void setTouchIndex(int touchIndex) {this.touchIndex = touchIndex;invalidate();}</span>@Overridepublic boolean onTouchEvent(MotionEvent event) {int index;switch (MotionEventCompat.getActionMasked(event)) {case MotionEvent.ACTION_DOWN://所在view中点击的Y坐标(屏幕中的绝对坐标),换算成位置index = (int) (event.getY() / cellHeight);if (index >= 0 && index < LETTERS.length) {if (index != touchIndex) {if (mOnLetterUpdateListener != null) {mOnLetterUpdateListener.onLetterUpdateListener(LETTERS[index]);touchIndex = index;}}}break;case MotionEvent.ACTION_MOVE:index = (int) (event.getY() / cellHeight);if (index >= 0 && index < LETTERS.length) {<span style="color:#ff0000;">if (index != touchIndex) {if (mOnLetterUpdateListener != null) {mOnLetterUpdateListener.onLetterUpdateListener(LETTERS[index]);touchIndex = index;}}</span>}break;case MotionEvent.ACTION_UP:break;default:break;}//重绘,被选中字母颜色变化invalidate();//拦截事件并处理return true;}<span style="color:#cc0000;">/*** 对外暴露字母监听*/
public interface OnLetterUpdateListener {void onLetterUpdateListener(String letter);
}
}</span>
这边注释得很详细,需要注意的地方,我都进行标红了!
2、布局:
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_persons"android:layout_width="match_parent"android:layout_height="match_parent"/><com.example.views.QuickIndexBarandroid:id="@+id/qib_bar"android:layout_width="40dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@color/gray_half"/>
</RelativeLayout>
这边本人使用了 RecyclerView 替换 listview
不过并不建议这么做,因为在点击索引栏定位时:

rv_persons.getLayoutManager().scrollToPosition(i);
recycleView 索引时是从下往上滚,只要符合要求的项为可视项就不在进行滚动,所以当你点击的字母栏字母,满足
item 在 目前可视项下方,recycleView 从下往上滚就会出现在当前界面最后一项,也就是底部项!
所以还是使用listview,这边最好的选择是使用 ExpandableListView ,以方便后期的扩展,虽然数据进行多次分组会很麻烦!

3、字符串转换成拼音工具类:

这边需要用到 pinyin4j-2.5.0.jar:下载地址:jar包下载地址

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/*** Created by f on 2015-12-01.* 根据汉子文本获取拼音首字母*/
public class PinYinUtil {/*** 将汉语拼音转化成字母** @param str 字符串* @return 字母串*/public static String getPinyin(String str) {//输出格式HanyuPinyinOutputFormat mFormat = new HanyuPinyinOutputFormat();//输出为大写字母mFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);//去掉音标mFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);StringBuilder sb = new StringBuilder();char[] chars = str.toCharArray();for (char c : chars) {//如果是空格跳过if (Character.isWhitespace(c)) {continue;}//判断是否为汉字if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {String s = "";try {//通过char得到拼音集合,单->dan或者是shans = PinyinHelper.toHanyuPinyinStringArray(c, mFormat)[0];sb.append(s);} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {badHanyuPinyinOutputFormatCombination.printStackTrace();sb.append(s);}} else if (Character.toString(c).matches("^[a-zA-Z]*")) {//判断是否是英语,是保留sb.append(c);} else {    //不是汉字不是英语的,保留下来的,使用“#”代替,归为一类sb.append("#");}}return sb.toString();}}

这边根据自己分组需求,进行整改!

4、Java bean类:


import com.example.utils.PinYinUtil;

import java.io.Serializable;/*** * 联系人界面bean,实现Comparable<Persons>接口对每个类的对象进行整体排序*/
public class Persons <span style="color:#cc0000;">implements Comparable<Persons>{</span>private String name;private String pinyin;private int imageId;public Persons() {}public Persons(int imageId, String name, String status) {this.imageId = imageId;this.name = name;this.status = status;this.pinyin = PinYinUtil.getPinyin(name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;}public String getPinyin() {return pinyin;}public void setPinyin(String pinyin) {this.pinyin = pinyin;}/*** 重写父类方法,对比pinyin进行自然排序** @param another Persons* @return 该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。*/@Overridepublic int compareTo(Persons another) {return this.pinyin.compareTo(another.getPinyin());}@Overridepublic String toString() {return "Persons{" +"name='" + name + '\'' +", pinyin='" + pinyin + '\'' +", imageId=" + imageId +'}';}
}

5、例子名单:

public static final String[] NAMES = new String[]{"宋江", "卢俊义", "吴用","公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深","武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘","雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍"," 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪","魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方","郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充","李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿","陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩","周通", "李忠", "杜兴", "汤隆", "邹渊", "邹润", "朱富", "朱贵", "蔡福", "蔡庆", "李立","李云", "焦挺", "石勇", "孙新", "顾大嫂", "张青", "孙二娘", " 王定六", "郁保四", "白胜","时迁", "段景柱", "&张三", "11级李四", "12级小明"};

6、适配器:


/**** 联系人列表适配器*/
public class PersonRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private List<Persons> mPersonsList;private static final int TYPE_HEADER = 0;private static final int TYPE_ITEM = 1;private static final int TYPE_FOOTER = 2;public PersonRVAdapter(List<Persons> personsList) {if (personsList == null) {throw new IllegalArgumentException("mRecentList must not be null");}mPersonsList = personsList;}@Overridepublic int getItemViewType(int position) {if (position == 0) {return TYPE_HEADER;} else if (position + 1 == getItemCount()) {return TYPE_FOOTER;} else {return TYPE_ITEM;}}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == TYPE_HEADER) {//头部项View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_rv_header, parent, false);HeaderViewHolder itemViewHolder = new HeaderViewHolder(itemView);return itemViewHolder;} else if (viewType == TYPE_ITEM) {//正常项View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_rv_item, parent, false);ItemViewHolder itemViewHolder = new ItemViewHolder(itemView);itemViewHolder.setIsRecyclable(true);return itemViewHolder;} else if (viewType == TYPE_FOOTER) {View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_rv_footer, parent, false);FooterViewHolder itemViewHolder = new FooterViewHolder(itemView);return itemViewHolder;}return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder != null) {if (holder instanceof HeaderViewHolder) {((HeaderViewHolder) holder).iv_header_image.setBackgroundResource(R.drawable.person);((HeaderViewHolder) holder).tv_header_what.setText("0.0");} else if (holder instanceof ItemViewHolder) {Persons persons = mPersonsList.get(position);String str = null;//当前联系人姓名首字母char c = persons.getPinyin().charAt(0);String currentLetter = c + "";if (position == 2) {str =currentLetter;} else {String lastLetter = mPersonsList.get(position - 1).getPinyin().charAt(0) + "";if (!TextUtils.equals(currentLetter, lastLetter)) {str = currentLetter;}}//根据str是否为空与是否为字母决定是否显示字母栏if ((c >= 'A' && str != null && c <= 'Z') || position == 2) {((ItemViewHolder) holder).tv_letter.setVisibility(View.VISIBLE);((ItemViewHolder) holder).tv_letter.setText(str);} else {((ItemViewHolder) holder).tv_letter.setVisibility(View.GONE);}((ItemViewHolder) holder).iv_person_header.setBackgroundResource(R.mipmap.ic_launcher);((ItemViewHolder) holder).tv_person_name.setText(persons.getName());} else if (holder instanceof FooterViewHolder) {}}}@Overridepublic int getItemCount() {return mPersonsList.size();}/*** ItemViewHolder*/public static final class ItemViewHolder extends RecyclerView.ViewHolder {//首字母public TextView tv_letter;//头像public ImageView iv_person_header;//from whopublic TextView tv_person_name;public ItemViewHolder(View itemView) {super(itemView);iv_person_header = (ImageView) itemView.findViewById(R.id.iv_person_header);tv_person_name = (TextView) itemView.findViewById(R.id.tv_person_name);tv_letter = (TextView) itemView.findViewById(R.id.tv_letter);}}/*** HeaderViewHolder*/public static final class HeaderViewHolder extends RecyclerView.ViewHolder {//功能logopublic ImageView iv_header_image;//功能名public TextView tv_header_what;public HeaderViewHolder(View itemView) {super(itemView);iv_header_image = (ImageView) itemView.findViewById(R.id.iv_header_image);tv_header_what = (TextView) itemView.findViewById(R.id.tv_header_what);}}/*** FooterViewHolder*/public static final class FooterViewHolder extends RecyclerView.ViewHolder {//功能logopublic ImageView iv_footer_image;//功能名public TextView tv_footer_what;//字母栏public TextView tv_letter_footer;public FooterViewHolder(View itemView) {super(itemView);iv_footer_image = (ImageView) itemView.findViewById(R.id.iv_footer_image);tv_footer_what = (TextView) itemView.findViewById(R.id.tv_footer_what);tv_letter_footer= (TextView) itemView.findViewById(R.id.tv_letter_footer);}}}

7、联系人界面:

/*** 联系人界面*/public class ContactsFragment extends Fragment {private OnFragmentInteractionListener mListener;//索引viewprivate QuickIndexBar qib_bar;//联系人列表private List<Persons> mPersonsList;//索引弹窗private PopupWindow mPopupWindow;//handler 处理者private Handler mHandler = new Handler();//弹窗异步关闭private Thread mThread = new Thread() {@Overridepublic void run() {<span style="color:#ff0000;"> if (mPopupWindow != null)mPopupWindow.dismiss();mPopupWindow = null;</span>}};//联系人列表private RecyclerView rv_persons;//recycleView布局类型private LinearLayoutManager mLayoutManager;//recycleView适配器private PersonRVAdapter mRVAdapter;//当前可见首项private int currentFirstIndex = -1;//下拉刷新private SwipeRefreshLayout srl_contacts;public static ContactsFragment newInstance(String param1, String param2) {ContactsFragment fragment = new ContactsFragment();
//        Bundle args = new Bundle();
//        args.putString(ARG_PARAM1, param1);
//        args.putString(ARG_PARAM2, param2);
//        fragment.setArguments(args);return fragment;}public ContactsFragment() {// Required empty public constructor}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//    findAllPersons();if (getArguments() != null) {
//            mParam1 = getArguments().getString(ARG_PARAM1);
//            mParam2 = getArguments().getString(ARG_PARAM2);}}/*** 真机测试,有联系人的情况下:* 填充数据*/
//    private void findAllPersons() {
//        Cursor cursor = getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
//        mPersonsList = new ArrayList<>();
//        if (cursor.moveToFirst()) {
//            do {
//                //获取联系人name
//                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//                Persons person = new Persons(name, R.mipmap.ic_launcher,"",0);
//                mPersonsList.add(person);
//            }while (cursor.moveToNext());
//        } else {
//            getDatas();
//        }
//        //根据name的首字母排序
//        Collections.sort(mPersonsList);
//    }/*** 非真机测试或者无数据情况下,读取备用数据*/
//    private void getDatas() {
//        if (ContactNames.NAMES.length != 0) {
//            for (String name : ContactNames.NAMES) {
//                Persons person = new Persons(name, R.mipmap.ic_launcher,"","0");
//                mPersonsList.add(person);
//            }
//        }
//    }@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {final View view = inflater.inflate(R.layout.main_fragment_contacts, container, false);srl_contacts= (SwipeRefreshLayout) view.findViewById(R.id.srl_contacts);srl_contacts.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {srl_contacts.setRefreshing(false);}});//联系人列表rv_persons = (RecyclerView) view.findViewById(R.id.rv_persons);mLayoutManager = new LinearLayoutManager(getContext());//        mLayoutManager.setStackFromEnd(true);// mLayoutManager.setReverseLayout(true);rv_persons.setLayoutManager(mLayoutManager);rv_persons.setItemAnimator(new DefaultItemAnimator());//  rv_persons.setHasFixedSize(false);mRVAdapter = new PersonRVAdapter(mPersonsList);qib_bar = (QuickIndexBar) view.findViewById(R.id.qib_bar);// 字母按键回调qib_bar.setOnLetterUpdateListener(new QuickIndexBar.OnLetterUpdateListener() {View view = LayoutInflater.from(getContext()).inflate(R.layout.pop_contacts_layout, null);TextView tv_content = (TextView) view.findViewById(R.id.tv_content);@Overridepublic void onLetterUpdateListener(String letter) {<span style="color:#ff0000;">if (mPopupWindow != null) {tv_content.setText(letter);} else {mPopupWindow = new PopupWindow(view, 80, 80, false);mPopupWindow.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.CENTER, 0, 0);}tv_content.setText(letter);</span>mHandler.removeCallbacks(mThread);mHandler.postDelayed(mThread, 1000);if (TextUtils.equals(letter, "↑") || TextUtils.equals(letter, "#")) {rv_persons.getLayoutManager().scrollToPosition(0);} else if (TextUtils.equals(letter, "☆")) {rv_persons.getLayoutManager().scrollToPosition(mPersonsList.size()-1);} else {//根据字母地位recycleViewfor (int i = 0; i < mPersonsList.size(); i++) {Persons person = mPersonsList.get(i);String where = person.getPinyin().charAt(0) + "";if (TextUtils.equals(letter, where)) {//判断是向上滑动还是向下滑动int currentLastPosition = mLayoutManager.findLastVisibleItemPosition();int currentFirstPosition = mLayoutManager.findFirstVisibleItemPosition();if (i > currentLastPosition) {//向下滑动int total = currentLastPosition - currentFirstPosition;rv_persons.getLayoutManager().scrollToPosition(i + total - 1);} else {//向上滑动rv_persons.getLayoutManager().scrollToPosition(i);}break;}}}}});rv_persons.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);<span style="color:#cc0000;">if (mPersonsList != null) {char c = mPersonsList.get(mLayoutManager.findFirstVisibleItemPosition()).getPinyin().charAt(0);currentFirstIndex = switchPinyin(c);//     if (newState == RecyclerView.SCROLL_STATE_IDLE) {qib_bar.setTouchIndex(currentFirstIndex);//   }</span>}}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);}});rv_persons.setAdapter(mRVAdapter);return view;}public void onButtonPressed(Uri uri) {if (mListener != null) {mListener.onFragmentInteraction(uri);}}@Overridepublic void onAttach(Context context) {super.onAttach(context);try {mListener = (OnFragmentInteractionListener) context;} catch (ClassCastException e) {throw new ClassCastException(context.toString()+ " must implement OnFragmentInteractionListener");}}@Overridepublic void onDetach() {super.onDetach();mListener = null;}/*** 首字母转化成对应position** @param c 字母* @return*/private int switchPinyin(char c) {int switchNew = -1;if (c >= 'A' && c <= 'Z') {switchNew = 2;for (char cc = 'A'; cc <= 'Z'; cc++) {if (c == cc) {break;}switchNew++;}} else {switchNew = 1;}return switchNew;}}

好了,差不多就这样,大家如果在参考我的方法出错了,可以留言一下,方便大家一起进步!

最后在贴个他人使用expandableListView实现的连接:点击打开链接,

如果你希望一级列表展开且不能关闭,可以加入一下代码:

for (int i = 0; i < mGroupList.size(); i++) {mExpandableListView.expandGroup(i);}mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {@Overridepublic boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {<span style="white-space:pre">  </span>   //group 点击事件进行拦截,不进行任何处理,就不会关闭了
<pre style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"><span style="white-space:pre">      </span>  v.setClickable(<span style="color:#000080;"><strong>false</strong></span>);

return true; } });

android 仿微信联系人 首字母分组快速索引相关推荐

  1. android 通讯录字母排序,Android仿微信联系人字母排序效果

    本文实例为大家分享了Android联系人字母排序的具体代码,供大家参考,具体内容如下 实现思路:首先说下布局,整个是一个相对布局,最下面是一个listview,listview上面是一个自定义的vie ...

  2. android 通讯录界面设计带字母,android仿微信联系人索引列表功能

    前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂 ...

  3. 联系人排序java代码_Android仿微信联系人按字母排序_脚本之家

    App只要涉及到联系人的界面,几乎都是按照字母排序以及导航栏的方式.既然这个需求这么火,于是开始学习相关内容,此篇文章是我通过参考网上资料独立编写和总结的,希望多多少少对大家有所帮助,写的不好,还请各 ...

  4. 联系人排序java代码_Android仿微信联系人按字母排序

    App只要涉及到联系人的界面,几乎都是按照字母排序以及导航栏的方式.既然这个需求这么火,于是开始学习相关内容,此篇文章是我通过参考网上资料独立编写和总结的,希望多多少少对大家有所帮助,写的不好,还请各 ...

  5. android仿微信联系人索引列表

    前言   因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太 ...

  6. Android 仿微信联系人Demo

    项目结构 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  7. Android仿微信实现通讯录字母列表索引

    下面先看下我的效果图: 有需要的可以点击这里下载源码点我点我!!!

  8. Android仿微信实现快速索引选择联系人

    Android仿微信实现快速索引选择联系人 原创 2016年03月05日 13:19:20 1640 3 1 一.概述 先看效果图,然后在给大家慢慢介绍  二.实现 先给大家说说这些城市的数据是怎么来 ...

  9. Android仿微信添加联系人列表,内附有截图和demo源码

    最新demo地址,仿微信添加联系人WXAddPersonDemo 分享一个Android仿微信选择联系人页面 之前做的App主要是工具类的,而且公司的产品经理也喜欢在App里设计很多自定义控件,所以比 ...

最新文章

  1. python3 psutil模块 进程和系统信息
  2. 一体机怎么修复音频服务器,教学触摸一体机没有声音怎么办?
  3. 手机信号放大器 让手机信号增强的办法
  4. 【转载】C# ??(问问,问号问号)运算符,可空值(申明加?(问号))的克星
  5. crt 8.7.3 黑暗模式_民谣缠绕厄运金属,抒情中的黑暗故事
  6. pandas 读取所有表头_像用excel一样用pandas
  7. ifdef的用法_chisel 高阶用法简介--rocket-chip generator
  8. java trim all,[JAVA中各种去除空格][java string.trim()][str.replaceAll去空格]
  9. eclipse注释中,文字大小不等的解决办法
  10. 1.3 三种交换方式:电路交换、分组交换、报文交换
  11. js做个人所得税计算器
  12. 【美化桌面】删除电脑桌面快捷键箭头
  13. 漏洞修复:web应用服务器版本信息泄露
  14. uniapp canvas 刮刮乐
  15. [CVPR2021]pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis
  16. 电车难题和他的n个**变种分享
  17. 下载夜神模拟器-安装autojs-连接vscode
  18. 旋转角度如何知道是顺时针还是逆时针旋转?(仅供参考,更靠谱的是旋转轴到z轴正半轴上)
  19. ITMars分享|IT运维工作到底是做什么的?
  20. 计算机病毒进化趋势,计算机病毒的遗传自进化研究预测.doc

热门文章

  1. 机器人 沈为民_科技智能重构创作力 创意产业弯道超车
  2. WIN10的用户管理与权限设置
  3. 短视频开发之短视频广告功能,教你玩转短视频营销
  4. 免费的瑞星2008杀毒软件!
  5. 算法(逻辑)优劣评估方法
  6. Linux 装机必备工具
  7. MTK功能机GPIO基本的入门操作
  8. 大咖专访:同Bigbang公链创始人“一休”一起见证区块链技术的缘起时刻!
  9. 如何让歌曲顺序播放html中,怎样让你内存卡里歌曲按照自己顺序播放.doc
  10. ajax请求修改标题,jQuery AJAX自定义标题