首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android -- 获取View宽高

在activity中可以调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0,所以只有上述条件都不成立时才能得到非0的width和height。 View的事件回调里使用 这时候该view已经被显示即被添加到DecorView上 如点击事件 触摸事件 焦点事件等 View view=findViewById(R.id.tv); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int width = v.getWidth(); } }); onWindowFocusChanged() 回调 在activity被显示出来时即添加到了DecorView上时获取宽和高如onWindowFocusChanged() 回调方法 @Override public void onWindowFocusChanged(boolean hasFocus) { View iv1 = findViewById(R.id.iv1); View iv2=findViewById(R.id.iv2); String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight(); String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight(); Log.i("onWindowFocusChanged() "+msg1); Log.i("onWindowFocusChanged() "+msg2); super.onWindowFocusChanged(hasFocus); } 延时 在onResume方法最后开线程300毫秒左右后获取宽和高 因为onResume执行完后300毫秒后,界面就显示出来了。 view.postDelayed(new Runnable() { @Override public void run() { View iv1 = findViewById(R.id.iv1); View iv2=findViewById(R.id.iv2); String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight(); String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight(); Log.i("onWindowFocusChanged() "+msg1); Log.i("onWindowFocusChanged() "+msg2); } }, 300); 在onCreate()或onResume()等方法中需要 getViewTreeObserver().addOnGlobalLayoutListener()来添为view加回调在回调里获得宽度或者高度获取完后让view删除该回调 view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.postDelayed(new Runnable() { @Override public void run() { View iv1 = findViewById(R.id.iv1); View iv2=findViewById(R.id.iv2); String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+" measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight(); String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+" measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight(); Log.i("onWindowFocusChanged() "+msg1); Log.i("onWindowFocusChanged() "+msg2); } }, 300); } }); 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4474217.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android InputMethod(输入法)

基于窗体打开输入法 /** * 基于窗体打开输入法 */ @OnClick(R.id.btn_open_window) public void onOpenWindow(){ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputMethodManager.showSoftInput(getWindow().getDecorView(), InputMethodManager.SHOW_FORCED); } 基于窗体打开输入法 /** * 基于窗体关闭输入法 */ @OnClick(R.id.btn_close_window) public void onCloseWindow(){ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); } 基于窗体自动打开关闭输入法 /** * 基于窗体自动打开关闭输入法 */ @OnClick(R.id.btn_toggle_window) public void onToggleWindow(){ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0, 0); } 打开或关闭输入法, 与基于窗体的区别在于它无法关闭基于窗体打开的输入法 /** * 打开或关闭输入法, 与基于窗体的区别在于它无法关闭基于窗体打开的输入法 */ @OnClick(R.id.btn_toggle) public void onToggle(){ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); }

优秀的个人博客,低调大师

Android封装单选与多选

平时开发的时候我们总会碰到这样的需求。 image.png 有时是多选,有时是单选,这样的页面基本都是用RecyclerView来做的,而如果每次做操作的时候都要去写这个单选框/多选框的逻辑,那就太麻烦了,所以我就想把这样的单选/多选列表功能给封装起来。 一.思路 这种功能的基本布局页面都是这样 image.png 或者有些需要把选择框放在右边 image.png 我的思路是外层还是用RecyclerView来做,里层(就是实线内)我打算用ViewModel来做,这样既能封装外层的选择框逻辑,对内层也低耦合。 二.效果展示 1.单选模式 15063446875651506344674549.gif 2.多选模式 15063446848301506344654342.gif PS:左边的布局是个ViewModel可以自由定义,因为时间的问题我没时间再写另外的布局来展示。 三.调用方法 调用方法很简单: 1.定义自己的ViewModel 2.调用 checkRecyclerView = new CheckRecyclerView.Builder<ChoseShopEntity>(this,"com.berchina.o2omerchant.ui.viewModel.shop.ChoseShopViewModel") .setItemDecoration(new XXXItemDecoration(10)) .setBackgroupColorResID(R.color.divider_grey) // .setCheckboxResID(R.drawable.cb_shop_create) .setIsRadio(false) .builder(); framelayout.addView(checkRecyclerView.getContentView()); Builder中的第二个参数我传的就是ViewModel的类名。 3.设置数据 checkRecyclerView.setAdapter(datalist); 封装好了用起来就是快,不会每次都要重复去写单选和复选的逻辑。 四.CheckRecyclerView内的操作 我这里把RecyclerView、Adapter和ViewHolder都写在一个类中,仿照RecyclerView源码的写法,当然分开写也行。 先贴全部代码吧 public class CheckRecyclerView<T extends CheckRecyclerView.CheckRecyclerEntity> { protected Context context; protected RecyclerView recyclerView; protected static CheckRecyclerAdapter adapter; // 0 表示都不显示,1表示显示左边,2表示显示右边 protected static int isShow; protected static String vmName; protected static int checkboxResID; protected static boolean isRadio; protected static RadioObserver radioObserver; // 监听单选 protected static MultiObserver multiObserver; // 监听多选 protected Builder builder; // 单选情况下的观察者 private static Action1<Integer> observer1 = new Action1<Integer>() { @Override public void call(Integer integer) { if (adapter != null){ adapter.checkChange(integer); } } }; // 多选情况下的观察者 private static Action1<Integer> observer2 = new Action1<Integer>() { @Override public void call(Integer integer) { if (adapter != null){ adapter.multiChose(integer); } } }; private CheckRecyclerView(Context context,Builder builder){ this.context = context; this.builder = builder; this.isShow = builder.isShow; this.vmName = builder.vmName; this.checkboxResID = builder.checkboxResID; this.isRadio = builder.isRadio; this.radioObserver = builder.radioObserver; this.multiObserver = builder.multiObserver; initView(); } private void initView(){ recyclerView = new RecyclerView(context); recyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); recyclerView.setBackgroundResource(builder.backgroupColorResID); recyclerView.setLayoutManager(builder.layoutManager); if (builder.itemDecoration != null) { recyclerView.addItemDecoration(builder.itemDecoration); } } /** * 设置适配器 */ public void setAdapter(){ List<T> datalist = builder.datalist; if (datalist == null){ datalist = new ArrayList<T>(); } adapter = new CheckRecyclerAdapter(context,datalist); recyclerView.setAdapter(adapter); } /** * 设置适配器 */ public void setAdapter(List<T> datalist){ adapter = new CheckRecyclerAdapter(context,datalist); recyclerView.setAdapter(adapter); } /** * get and set 方法 */ public RecyclerView getContentView() { return recyclerView; } public static CheckRecyclerAdapter getAdapter() { return adapter; } public void setIsShow(int isShow) { this.isShow = isShow; } public static void setVmName(String vmName) { CheckRecyclerView.vmName = vmName; } /** * 获取到选择的结果 * 规则:-1表示没有选择 */ // 单选左 public int getLeftRadio(){ if (adapter != null && adapter.getDatas() != null && adapter.getDatas().size() > 0){ return adapter.getLeftRadio(); } return -1; } // 单选右 public int getRightRadio(){ if (adapter != null && adapter.getDatas() != null && adapter.getDatas().size() > 0){ return adapter.getRightRadio(); } return -1; } // 多选左 返回被选中的数组 public List<Integer> getLeftMulti(){ List<Integer> multiList = new ArrayList<>(); if (adapter != null && adapter.getDatas() != null && adapter.getDatas().size() > 0){ for (int i = 0; i < adapter.getDatas().size(); i++) { if (((CheckRecyclerEntity)adapter.getDatas().get(i)).leftCheck == true) { multiList.add(i); } } } return multiList; } // 多选右 返回被选中的数组 public List<Integer> getRightMulti(){ List<Integer> multiList = new ArrayList<>(); if (adapter != null && adapter.getDatas() != null && adapter.getDatas().size() > 0){ for (int i = 0; i < adapter.getDatas().size(); i++) { if (((CheckRecyclerEntity)adapter.getDatas().get(i)).rightCheck == true) { multiList.add(i); } } } return multiList; } /** * 判断在多选的情况下是否全部选择 */ public boolean isAllChose(){ Boolean isAllChose = true; if (adapter != null && adapter.getDatas() != null && adapter.getDatas().size() > 0) { if (isShow == 1) { for (int i = 0; i < adapter.getDatas().size(); i++) { if (((CheckRecyclerEntity)adapter.getDatas().get(i)).leftCheck == false){ return false; } } } else if (isShow == 2) { for (int i = 0; i < adapter.getDatas().size(); i++) { if (((CheckRecyclerEntity)adapter.getDatas().get(i)).rightCheck == false){ return false; } } } else { return false; } }else { isAllChose = false; } return isAllChose; } /** * 外部控制内部进行单选的操作 */ public void setRadio(int position){ if (adapter != null){ adapter.checkChange(position); } } /** * 设置全选/全不选 * 规则:true表示全选 false表示全不选 */ public void setAllMulti(Boolean bol){ if (adapter != null){ adapter.setAllMulti(bol); } } /** * recycelerView 的 adapter */ public static class CheckRecyclerAdapter<T extends CheckRecyclerEntity> extends XXXRecyclerViewBaseAdapter<T>{ // 记录单选的选项(用空间换时间) private int leftRadio = -1; private int rightRadio = -1; public CheckRecyclerAdapter(Context context, List dataSource) { super(context, dataSource); } @Override protected BerRecyclerViewHolder getViewHolder(ViewGroup parent) { return new CheckRecyclerViewHolder(LayoutInflater.from(context).inflate(R.layout.item_check_recycler,parent,false),context); } /** * 单选 */ public void checkChange(int position){ if (position < dataSource.size()) { // 先将所有都设为未点击 for (int i = 0; i < dataSource.size(); i++) { dataSource.get(i).leftCheck = false; dataSource.get(i).rightCheck = false; } // 再设置点击的Item if (isShow == 1) { dataSource.get(position).leftCheck = true; leftRadio = position; }else if (isShow == 2){ dataSource.get(position).rightCheck = true; rightRadio = position; } // 做响应 if (radioObserver != null) { radioObserver.radioClick(position, isShow); } this.notifyDataSetChanged(); } } /** * 多选 */ public void multiChose(int position){ // 点击后展示相反的情况 if (isShow == 1) { dataSource.get(position).leftCheck = !dataSource.get(position).leftCheck; }else if (isShow == 2){ dataSource.get(position).rightCheck = !dataSource.get(position).rightCheck; } // 做响应 if (multiObserver != null) { multiObserver.multiClick(position, isShow); } this.notifyDataSetChanged(); } /** * 设置全选 */ public void setAllMulti(Boolean bol){ if (isShow == 1) { for (int i = 0; i < dataSource.size(); i++) { dataSource.get(i).leftCheck = bol; } this.notifyDataSetChanged(); }else if (isShow == 2){ for (int i = 0; i < dataSource.size(); i++) { dataSource.get(i).rightCheck = bol; } this.notifyDataSetChanged(); } } // get and set public int getLeftRadio() {return leftRadio;} public int getRightRadio() {return rightRadio;} } /** * recycelerView 的 viewholder */ public static class CheckRecyclerViewHolder<T extends CheckRecyclerEntity> extends XXXRecyclerViewHolder<T>{ @InjectView(R.id.cb_left) CheckBox cbLeft; @InjectView(R.id.cb_right) CheckBox cbRight; @InjectView(R.id.fl_content) FrameLayout flContent; private BaseViewModel viewmodel; public CheckRecyclerViewHolder(View itemView, Context context) { super(itemView, context); ButterKnife.inject(this,itemView); if (isShow == 0){ cbLeft.setVisibility(View.GONE); cbRight.setVisibility(View.GONE); }else if (isShow == 1){ cbLeft.setVisibility(View.VISIBLE); cbRight.setVisibility(View.GONE); }else if (isShow == 2){ cbLeft.setVisibility(View.GONE); cbRight.setVisibility(View.VISIBLE); } // 设置CheckBox的样式 if (checkboxResID != 0) { cbLeft.setButtonDrawable(checkboxResID); cbRight.setButtonDrawable(checkboxResID); } // 应反射创建viewmodel对象 try { Class<?> myClass = Class.forName(vmName);//完整类名 Class[] paramTypes = { Context.class }; Object[] params = {context}; Constructor con = myClass.getConstructor(paramTypes); viewmodel = (BaseViewModel) con.newInstance(params); flContent.addView(viewmodel.getContentView()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } @Override public void setDataToView() { super.setDataToView(); // 处理选择框的点击 , 只做数据展示,逻辑放在外边处理 cbLeft.setChecked(data.leftCheck); cbRight.setChecked(data.rightCheck); //为viewmodel添加数据 viewmodel.setData(data); } /** * 接下来做 单选 和 多选 的操作 todo 先测试单选看看能不能用 */ @OnClick({R.id.cb_left,R.id.cb_right}) public void itemClick(View v){ switch (v.getId()){ case R.id.cb_left: if (isRadio) { // 单选 Observable.just(getAdapterPosition()).subscribe(observer1); }else { // 多选 Observable.just(getAdapterPosition()).subscribe(observer2); } break; case R.id.cb_right: if (isRadio) { Observable.just(getAdapterPosition()).subscribe(observer1); }else { Observable.just(getAdapterPosition()).subscribe(observer2); } break; } } } /** * 定义两个数据来记录是否点击选择框 * 规则:调用封装的数据类要继承这个类 */ public static class CheckRecyclerEntity{ public boolean leftCheck; public boolean rightCheck; } /** * ======================================================================= * Builder方法 * ======================================================================== */ public static class Builder<T extends CheckRecyclerView.CheckRecyclerEntity>{ private Context context; private int isShow = 1; // 默认为显示左边的 private String vmName; private List<T> datalist; //RecyclerView相关 private RecyclerView.ItemDecoration itemDecoration; private RecyclerView.LayoutManager layoutManager; private int backgroupColorResID; //RecyclerView背景颜色,默认为白色 // checkbox相关 private int checkboxResID = 0; private boolean isRadio = true;// 定义单选(true)和多选(true) private RadioObserver radioObserver; // 监听单选 private MultiObserver multiObserver; // 监听多选 // 这个一定要传完整 包名+类名 public Builder(Context context,String vmName){ this.context = context; this.vmName = vmName; layoutManager = new LinearLayoutManager(context); backgroupColorResID = R.color.white; } public Builder setIsShow(int isShow) { this.isShow = isShow; return this; } public Builder setDatalist(List<T> datalist) { this.datalist = datalist; return this; } public Builder setItemDecoration(RecyclerView.ItemDecoration itemDecoration) { this.itemDecoration = itemDecoration; return this; } public Builder setLayoutManager(RecyclerView.LayoutManager layoutManager) { this.layoutManager = layoutManager; return this; } public Builder setCheckboxResID(int checkboxResID) { this.checkboxResID = checkboxResID; return this; } public Builder setBackgroupColorResID(int backgroupColorResID) { this.backgroupColorResID = backgroupColorResID; return this; } public Builder setIsRadio(boolean radio) { isRadio = radio; return this; } public Builder setRadioObserver(RadioObserver radioObserver) { this.radioObserver = radioObserver; return this; } public Builder setMultiObserver(MultiObserver multiObserver) { this.multiObserver = multiObserver; return this; } public CheckRecyclerView builder(){ return new CheckRecyclerView(context,this); } } /** * 单选时的响应 */ public interface RadioObserver{ public void radioClick(int position,int isShow); } /** * 多选时的响应 */ public interface MultiObserver{ public void multiClick(int position,int isShow); } } 代码也不能说长,500行这样,其实还好。也只封装了一些基本的功能操作,之后还可以扩展。其实我还算挺良心的,加了很多注解,我个人习惯先写注解再写方法。 基类的XXXRecyclerViewBaseAdapter和XXXRecyclerViewHolder是我自己写的Adapter和ViewHolder的基类 1.基本的流程 我有注解也不一行一行解释,主要是用了Builder模式,在外边使用时可以addView,用自定义写XML控件也行。 定义单选和多选的规则: (1)protected static int isShow; 0 表示都不显示,1表示显示左边,2表示显示右边,默认为1 (2)protected static boolean isRadio; 表示单选/多选,true表示单选,false表示多选 定义RecyclerView private void initView(){ recyclerView = new RecyclerView(context); recyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); recyclerView.setBackgroundResource(builder.backgroupColorResID); recyclerView.setLayoutManager(builder.layoutManager); if (builder.itemDecoration != null) { recyclerView.addItemDecoration(builder.itemDecoration); } } 数据要继承 public static class CheckRecyclerEntity{ public boolean leftCheck; public boolean rightCheck; } 表示左边是否点击和右边是否点击 最关键是ViewHolder的两个方法: (1)initView public CheckRecyclerViewHolder(View itemView, Context context) { super(itemView, context); ButterKnife.inject(this,itemView); if (isShow == 0){ cbLeft.setVisibility(View.GONE); cbRight.setVisibility(View.GONE); }else if (isShow == 1){ cbLeft.setVisibility(View.VISIBLE); cbRight.setVisibility(View.GONE); }else if (isShow == 2){ cbLeft.setVisibility(View.GONE); cbRight.setVisibility(View.VISIBLE); } // 设置CheckBox的样式 if (checkboxResID != 0) { cbLeft.setButtonDrawable(checkboxResID); cbRight.setButtonDrawable(checkboxResID); } // 应反射创建viewmodel对象 try { Class<?> myClass = Class.forName(vmName);//完整类名 Class[] paramTypes = { Context.class }; Object[] params = {context}; Constructor con = myClass.getConstructor(paramTypes); viewmodel = (BaseViewModel) con.newInstance(params); flContent.addView(viewmodel.getContentView()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } 首先判断isShow 是单选/多选/隐藏 来展示页面。然后设置CheckBox的样式。 最后创建ViewModel对象添加到最上边图中实线的区域中。但是我们展示的页面并不是固定的,也就是说我们会在不同的情况创建不同的viewmodel对象,所以这里不能直接写,我用了反射来添加viewmodel,所以在上边调用的地方传了viewmodel的包名+类名,是为了用类名创建相应的viewmodel对象添加到区域中。 (2)setDataToView @Override public void setDataToView() { super.setDataToView(); // 处理选择框的点击 , 只做数据展示,逻辑放在外边处理 cbLeft.setChecked(data.leftCheck); cbRight.setChecked(data.rightCheck); //为viewmodel添加数据 viewmodel.setData(data); } 这个就很简单了,根据leftCheck和rightCheck的值设置左右checkbox的展示,然后给viewmodel设置数据。 2.点击时的处理 做完展示时的处理之后就要做点击时的逻辑处理。 @OnClick({R.id.cb_left,R.id.cb_right}) public void itemClick(View v){ switch (v.getId()){ case R.id.cb_left: if (isRadio) { // 单选 Observable.just(getAdapterPosition()).subscribe(observer1); }else { // 多选 Observable.just(getAdapterPosition()).subscribe(observer2); } break; case R.id.cb_right: if (isRadio) { Observable.just(getAdapterPosition()).subscribe(observer1); }else { Observable.just(getAdapterPosition()).subscribe(observer2); } break; } } 先判断点左还是点右,再判断是单选模式还是多选模式,我这里用了观察者模式。 // 单选情况下的观察者 private static Action1<Integer> observer1 = new Action1<Integer>() { @Override public void call(Integer integer) { if (adapter != null){ adapter.checkChange(integer); } } }; // 多选情况下的观察者 private static Action1<Integer> observer2 = new Action1<Integer>() { @Override public void call(Integer integer) { if (adapter != null){ adapter.multiChose(integer); } } }; 点击之后会在adapter中做响应操作。 /** * 单选 */ public void checkChange(int position){ if (position < dataSource.size()) { // 先将所有都设为未点击 for (int i = 0; i < dataSource.size(); i++) { dataSource.get(i).leftCheck = false; dataSource.get(i).rightCheck = false; } // 再设置点击的Item if (isShow == 1) { dataSource.get(position).leftCheck = true; leftRadio = position; }else if (isShow == 2){ dataSource.get(position).rightCheck = true; rightRadio = position; } // 做响应 if (radioObserver != null) { radioObserver.radioClick(position, isShow); } this.notifyDataSetChanged(); } } /** * 多选 */ public void multiChose(int position){ // 点击后展示相反的情况 if (isShow == 1) { dataSource.get(position).leftCheck = !dataSource.get(position).leftCheck; }else if (isShow == 2){ dataSource.get(position).rightCheck = !dataSource.get(position).rightCheck; } // 做响应 if (multiObserver != null) { multiObserver.multiClick(position, isShow); } this.notifyDataSetChanged(); } 注释都有,算法也不难,不用详细去讲了。主要封装的逻辑其实也就这些,而其他的方法基本都是和外边交互时用到的方法,我都写了注释。 比如 /** * 外部控制内部进行单选的操作 */ public void setRadio(int position){ if (adapter != null){ adapter.checkChange(position); } } 这个就是外面要求里面单选哪个。比如说有些需求是要默认选第一个,所以可以在外面调用checkRecyclerView.setRadio(0); /** * 设置全选/全不选 * 规则:true表示全选 false表示全不选 */ public void setAllMulti(Boolean bol){ if (adapter != null){ adapter.setAllMulti(bol); } } 这是设置全选,比如外面点击哪个按钮后里面显示全选,那就在外面调用checkRecyclerView.setAllMulti(true); 其它的什么我都加了注释,就不都说了。 3.Builder的属性 简单介绍在Builder中定义的属性吧 (1)isShow 显示选择框在左还是右 (2)datalist需要适配的数据 (3)itemDecoration RecyclerView的分割线 (4)layoutManager RecyclerView的布局 (5)backgroupColorResID RecyclerView的颜色 (6)checkboxResID Checkbox的样式ID (7)isRadio 单选还是多选 (8)radioObserver 单选的监听,要实现这个接口 (9)multiObserver 多选的监听 (10)vmName viewmodel的包名+类名注意要传包名+类名,只传类名不行吗?不行,因为不同的包下可以有相同的类名,我怎么懂是要哪个。 其实我觉得代码也不算多,也不难理解,最近没时间也没能写个demo放到github上,之后闲下来再弄吧。然后也没经过严格的测试,可能一些地方写得不是很好。 更新 后来我用这个东西发现一个错的地方,就是内部类和成员都不要使用static,不然在多处使用的时候会出错。当初习惯性的会下意思使用静态内部类,后来发现用着用着就有问题了。还是太粗心了。把代码中的静态内部类和静态成员改成非静态的就行。

优秀的个人博客,低调大师

Android--刷机教程

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/77982282 1、打开https://twrp.me/Devices/网站,输入手机型号下载recovery 2、刷入recovery 第一步:在电脑上下载并解压通用fastboot工具,下载地址:http://pan.baidu.com/s/1jHm5YgI这个小工具是一个绿色adb工具,刷入完成以后,直接删除即可,不会像刷机精灵那种软件还要怎么卸载、删除注册表之类。下载解压后,如图所示,我们把它放在一边,建议解压到桌面,方便查找。 第二步:第一步下载好的的img格式的recovery包,一定要是.img格式后缀的文件,我们把它重命名为recovery.img,如图所示,然后我们把这个img格式的文件复制到刚才解压好的“通用fastboot工具”里面,如图所示哦。 第三步:这个时候,就需要把手机进入到fastboot模式,将手机关机,同时按住音量下+电源键 即可进入到fastboot模式,相信部分发烧友对这个模式非常熟悉吧~当手机出现下面这个样子后,就代表已经进入到fastboot模式了。 第四步:将已经进入到fastboot模式下的手机连接电脑,如果电脑提示没有连接成功,基本上是驱动没有安装好造成的,建议先在电脑上安装好驱动。连接好后,双击打开通用fastboot工具文件夹,按住键盘上的shift键,同时鼠标在空白处右击,选择出现的对话框里的”在此处打开对话框窗口“,如图所示。 第五步:此时,手动输入”fastboot flash recovery recovery.img“(引号不需要输入),输入完毕后,按回车键确认。当屏幕上出现下方类似字符后,提示”okay、finished“等字样,即表示刷入成功。这时,拔掉数据线即可完成所有步骤!要检查的话,拔掉数据线,长按电源键出现mi标志重新启动时按住音量上+电源键 进入rec,否则还是官方rec哦~ 4、去ROM之家、ROM基地等网站查找下载自己手机型号的rom包(.zip格式),然后重命名为update.zip;传到手机SD卡。 5、然后手机关机,同时按住关机键和音量下键,进入recovery模式 双wipe: wipedata/factoryreset——Yes——deletealluserdata. wipecachepartition——Yes-WipeCache. 返回主界面,选择【Installzip from SDCARD】(从SD卡选择更新)然后再选择【choose zip from sdcard】(从SD卡选择升级包更新),接着选中你放入存储卡中的ROM包【update.zip】,选择是,等待完成,返回上级菜单,最后选择【Reboot system now】

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册