技术标签: Android学习笔记 android
目录
使用startActivity()进行跳转,使用Intent传递数据;
表示从当前界面跳转至XmlActicity
比如要打开百度首页,只设置网页和动作,手机下方弹出所有的浏览器供用户选择。
TextView、Button、EditText、ImageView
线性布局LinearLayout 、相对布局RelativeLayout 、帧布局FrameLayout
相对布局(相对于xx的位置)
帧布局 (写在越下面,则界面元素相对位于上面)
以.9.png为拓展名的png图片文件,可拉伸位图,适用于不定长内容背景(eg:聊天气泡)。
当前手机为xxhdpi,但是文件中最高密度只有xhdpi的图片,则从高到底查找,即xxhdpi中没有,则用xhdpi文件的图片。国内企业通常选择一个稍大密度的目录存放一份图片(减小apk包大小),原因:缩放不会失真,扩大可能会有一些失真。
● 触摸事件(MotionEvent):ACTION_DOWN、ACTION_MOVE、ACTION_UP
● 事件分发(Dispatch):dispatchTouchEvent
● 事件拦截 (Intercept):onInterceptTouchEvent
eg:
没当一个触摸事件到来,都是从 上往下执行分发,从下往上执行消费事件,即从Activity往View分发,如果有拦截事件则停止往下分发,回传执行消费事件,没有消费成功(消费事件的bool值为false时)往上回传给上一层消费,如果到最高层的Activity也没有消费,则该事件就被抛弃。
一个显示可滚动项目的视图组件,系统使用Adapter(适配器)将列表项目插入列表,适配器从来源提取内容。在Android 5.0版本之后提供了RecycleView去替代ListView和GridView,提供了一种插拔式的体验,即模块化。
采用MVC模式, 模型(model)-视图(view)-控制器 (controller)
ps:引用自代码丶如风ActivityView其实就是在UI屏幕上可见的视图(onScreenView),也是与用户进行交互的View,那么这些View会通过RecycleBin直接存储到mActivityView数组当中,以便为了直接复用,那么当我们滑动ListView的时候,有些View被滑动到屏幕之外(offScreen) View,那么这些View就成为了ScrapView,也就是废弃的View,已经无法与用户进行交互了,这样在UI视图改变的时候就没有绘制这些无用视图的必要了。他将会被RecycleBin存储到mScrapView数组当中,但是没有被销毁掉,目的是为了二次复用,也就是间接复用。当新的View需要显示的时候,先判断mActivityView中是否存在,如果存在那么我们就可以从mActivityView数组当中直接取出复用,也就是直接复用,否则的话从mScrapView数组当中进行判断,如果存在,那么二次复用当前的视图,如果不存在,那么就需要inflate View了。
①布局
②适配器的代码:
自定义一个适配器,继承自BaseAdapter,重写四个方法,getCount、getItem、getItemId、getView
public class ListBaseAdapter extends BaseAdapter {
private static final int NUM_LIST_ITEMS = 100;
// 数据集总个数
@Override
public int getCount() {
return NUM_LIST_ITEMS;
}
// 根据position获取数据对象
@Override
public Object getItem(int position) {
return null;
}
// 根据position获取数据对象的id
@Override
public long getItemId(int position) {
return 0;
}
// 对应position的item数据展示样式view
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// 查看convertView是否为空,如果为空则重新创建,使用setTag方法实现保留复用
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(parent.getContext(), R.layout.number_list_item, null);
holder.listItemNumberView = (TextView) convertView.findViewById(R.id.tv_item_number);
holder.viewHolderIndex = (TextView) convertView.findViewById(R.id.tv_view_holder_instance);
convertView.setTag(holder);
} else {
// 复用机制,直接使用viewholder,无需每次都find id
holder = (ViewHolder) convertView.getTag();
}
// 更新item对应的数据值
holder.listItemNumberView.setText(String.valueOf(position));
holder.viewHolderIndex.setText(String.format("ViewHolder index: %s", position));
int backgroundColorForViewHolder = ColorUtils.
getViewHolderBackgroundColorFromInstance(convertView.getContext(), position % 10);
convertView.setBackgroundColor(backgroundColorForViewHolder);
return convertView;
}
private static class ViewHolder {
private TextView viewHolderIndex;
private TextView listItemNumberView;
}
}
③编写Activity,设置我们自己写的适配器。
public class ListViewActivity extends AppCompatActivity {
private Toast mToast;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
ListView listView = (ListView) findViewById(R.id.list_numbers);
listView.setAdapter(new ListBaseAdapter());
listView.setDivider(null);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mToast != null) {
mToast.cancel();
}
String toastMessage = "Item #" + position + " clicked.";
mToast = Toast.makeText(ListViewActivity.this, toastMessage, Toast.LENGTH_LONG);
mToast.show();
}
});
}
}
注意: 在ListView中可以实现Click很简单,直接调用setOnItemClickListner,如上诉代码所示。
相比于ListView只能做上下滑动的视图,而RecyclerView可以灵活地使用包括线性布局(支持纵向、横向滑动)、网络布局、瀑布流。
①布局
②编写适配器
核心的方法:onCreateViewHolder、onBindViewHolder、getItemCount(类似于ListView中的getCount)
在ListView中,需要我们手动去实现ViewHolder,而在RecyclerView中将ViewHolder的方法接口暴露出来。
如果没有ViewHolder则通过onCreateViewHolder创建,有则调用onBindViewHolder。在onBindViewHolder中通过我们自己写的bind函数设置相应的视图。
/**
* 适配器
*/
public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> {
private static final String TAG = "GreenAdapter";
private int mNumberItems;
private final ListItemClickListener mOnClickListener;
private static int viewHolderCount;
public GreenAdapter(int numListItems, ListItemClickListener listener) {
mNumberItems = numListItems;
mOnClickListener = listener;
viewHolderCount = 0;
}
/*
* 一般会预留2~4个ViewHolder,off screen的数量由mCachedSize来决定
*
* The number of ViewHolders that have been created. Typically, you can figure out how many
* there should be by determining how many list items fit on your screen at once and add 2 to 4
* to that number. That isn't the exact formula, but will give you an idea of how many
* ViewHolders have been created to display any given RecyclerView.
*
* Here's some ASCII art to hopefully help you understand:
*
* ViewHolders on screen:
*
* *-----------------------------*
* | ViewHolder index: 0 |
* *-----------------------------*
* | ViewHolder index: 1 |
* *-----------------------------*
* | ViewHolder index: 2 |
* *-----------------------------*
* | ViewHolder index: 3 |
* *-----------------------------*
* | ViewHolder index: 4 |
* *-----------------------------*
* | ViewHolder index: 5 |
* *-----------------------------*
* | ViewHolder index: 6 |
* *-----------------------------*
* | ViewHolder index: 7 |
* *-----------------------------*
*
* Extra ViewHolders (off screen)
*
* *-----------------------------*
* | ViewHolder index: 8 |
* *-----------------------------*
* | ViewHolder index: 9 |
* *-----------------------------*
* | ViewHolder index: 10|
* *-----------------------------*
* | ViewHolder index: 11|
* *-----------------------------*
*
* index:12 from where?
*
* Total number of ViewHolders = 12
*
*
* 不做特殊处理:最多缓存多少个ViewHolder N(第一屏可见) + 2 mCachedSize + 5*itemType RecyclePool
*
* 找到position一致的viewholder才可以复用,新的位置由于position不一致,所以不能复用,重新创建新的
* 这也是为什么 mCachedViews一开始缓存的是0、1 所以 8、9、10需要被创建,
* 那为什么10 和 11也要被创建?
*
* 当view完全不可见的时候才会被缓存回收,这与item触发getViewForPosition不同,
* 当2完全被缓存的时候,实际上getViewForPosition已经触发到11了,此时RecyclePool有一个viewholder(可以直接被复用)
* 当12触发getViewForPosition的时候,由于RecyclePool里面有,所以直接复用这里的viewholder
* 问题?复用的viewholder到底是 0 1 2当中的哪一个?
*
*
* RecycleView 对比 ListView 最大的优势,缓存的设计,减少bindView的处理
*/
@NonNull
@Override
public NumberViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
int layoutIdForListItem = R.layout.number_list_item;
LayoutInflater inflater = LayoutInflater.from(context);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
NumberViewHolder viewHolder = new NumberViewHolder(view);
viewHolder.viewHolderIndex.setText("ViewHolder index: " + viewHolderCount);
int backgroundColorForViewHolder = ColorUtils
.getViewHolderBackgroundColorFromInstance(context, viewHolderCount);
viewHolder.itemView.setBackgroundColor(backgroundColorForViewHolder);
Log.d(TAG, "onCreateViewHolder: number of ViewHolders created: " + viewHolderCount);
viewHolderCount++;
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull NumberViewHolder numberViewHolder, int position) {
Log.d(TAG, "onBindViewHolder: #" + position);
numberViewHolder.bind(position);
}
@Override
public int getItemCount() {
return mNumberItems;
}
public class NumberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final TextView viewHolderIndex;
private final TextView listItemNumberView;
public NumberViewHolder(@NonNull View itemView) {
super(itemView);
listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
viewHolderIndex = (TextView) itemView.findViewById(R.id.tv_view_holder_instance);
itemView.setOnClickListener(this);
}
public void bind(int position) {
listItemNumberView.setText(String.valueOf(position));
// viewHolderIndex.setText(String.format("ViewHolder index: %s", getAdapterPosition()));
// int backgroundColorForViewHolder = ColorUtils.
// getViewHolderBackgroundColorFromInstance(itemView.getContext(), getAdapterPosition() % 10);
// itemView.setBackgroundColor(backgroundColorForViewHolder);
}
@Override
public void onClick(View v) {
int clickedPosition = getAdapterPosition();
if (mOnClickListener != null) {
mOnClickListener.onListItemClick(clickedPosition);
}
}
}
// 自定义接口
public interface ListItemClickListener {
void onListItemClick(int clickedItemIndex);
}
}
public class RecycleViewActivity extends AppCompatActivity implements GreenAdapter.ListItemClickListener {
private static final String TAG = "wangyi";
private static final int NUM_LIST_ITEMS = 100;
private GreenAdapter mAdapter;
private RecyclerView mNumbersListView;
private Toast mToast;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleview);
mNumbersListView = findViewById(R.id.rv_numbers);
// LinearLayoutManager布局管理,定义布局样式
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mNumbersListView.setLayoutManager(layoutManager);
/*
* Use this setting to improve performance if you know that changes in content do not
* change the child layout size in the RecyclerView
*/
mNumbersListView.setHasFixedSize(true);
/*
* The GreenAdapter is responsible for displaying each item in the list.
*/
mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this);
mNumbersListView.setAdapter(mAdapter);
mNumbersListView.addOnScrollListener(new RecyclerView.OnScrollListener() {
// 最后一个完全可见项的位置
private int lastCompletelyVisibleItemPosition;
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (visibleItemCount > 0 && lastCompletelyVisibleItemPosition >= totalItemCount - 1) {
Toast.makeText(RecycleViewActivity.this, "已滑动到底部!,触发loadMore", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
lastCompletelyVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();
}
Log.d(TAG, "onScrolled: lastVisiblePosition=" + lastCompletelyVisibleItemPosition);
}
});
}
@Override
public void onListItemClick(int clickedItemIndex) {
Log.d(TAG, "onListItemClick: ");
if (mToast != null) {
mToast.cancel();
}
String toastMessage = "Item #" + clickedItemIndex + " clicked.";
mToast = Toast.makeText(this, toastMessage, Toast.LENGTH_LONG);
mToast.show();
}
}
注意:在RecyclerView中默认没有像ListView中的点击方法。做法如下:
文章浏览阅读1.5k次。系统展示技术框架 开发语言:Java; 后端框架:SSM; 持久层框架:MyBatis 前端技术:jQuery.js,js,CSS; 中间件:Tomcat(apache-tomcat-8.0.47); 数据库:MySQL5.7/mariadb-10.3.14-winx64; 开发工具:Eclipse,HeidiSQL/Navicat; 开发环境建议开发者使用以下环境,这样避免版本带来的问题 IDE:ecl_基于ssm的在线考试系统的设计与实现
文章浏览阅读993次,点赞3次,收藏2次。MAC地址 长度48位即物理地址/硬件地址,全1为数据链路层广播地址。无效MAC帧IEEE802.3:帧长度不是整数个字节;检验序列 FCS 查出差错;数据字段长度太大或太小。MAC帧格式目的地址 6Byte 源地址 6Byte 类型 2Byte 数据字段 46Byte~1500Byte FCS 4Byte其中:1500Byte是MTU。46是以太网最短帧长减去6+6+2+4=18Byte。LAN特点无线局域网标准IEEE 802.11。其地理范围和站点数目都有限。可以_10mbit/s以太网最小的争用期长度
文章浏览阅读9.9k次,点赞3次,收藏46次。在上一篇文章《使用朴素贝叶斯算法对文档分类详解》中,我们实现了用朴素贝叶斯算法对简单文档的分类,今天我们将利用此分类器来过滤垃圾邮件。1. 准备数据——文本切分之前算法中输入的文档格式为单词向量,例如['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],而实际情况中通常要处理的是文本(例如邮件),那么就要先将文本转换为词向量,..._朴素贝叶斯算法提取中文单词
文章浏览阅读337次。一、Swing1.概述与AWT类似,Swing也是GUI的一部分,并且Swing是在AWT组件基础上构建的,它所提供的功能要比AWT提供的更为广泛既然Swing是在AWT基础上构建的,那么Swing中就包含AWT中的各种组件,只是形式略有区别,用法相同我们在使用Swing开发时,只需要很少的代码就可以利用其丰富、灵活的功能和模块化组件来创建更优雅的用户界面2.顶层容器使用Swing时,..._swing显示
文章浏览阅读1.3k次。07款的E280、开了24万公里。于2021年5月5日出现发动机灯亮。到修理厂电脑检查右列气缸组二次空气喷射故障(功能链)P0410 ,这是第一次出现。由于经常给候车的丁总没有在,其他工程师只是将故障码清楚,说再观察观察。2021年5月16日 故障灯亮 P0410,送到修理厂,由丁总亲自检查![在这里插入图片描述](https://img-blog.csdnimg.cn/20210622114924979.png?x-oss-process=image/watermark,type_ZmFuZ3poZW_p0410
文章浏览阅读4.6k次。当用到河流或者别的有水域存在的东西的时候,如果要对人物走在水面上添加一个水纹效果,或者东西掉落在水里边有个水花四溅的效果,这都需要粒子系统做出来的水花效果(waterEffect)的结合,首先是检测碰撞,然后是在碰撞点实例化一个waterEffect_unity 雨打地上的水花
文章浏览阅读2k次。centos,使用pm2部署node应用之后,发现访问不了,单独node启动也访问不了最后究其原因,端口被挡了。。。解决方法:$ /sbin/iptables -I INPUT -p tcp --dport 58089 -j ACCEPT执行后,可以访问了。。。记录之..._node-red 启动网页不显示
文章浏览阅读5.8k次,点赞3次,收藏2次。其实想要重置 5.7 的密码很简单,就一层窗户纸:1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1这一行配置让 mysqld 启动时不对密码进行验证2、重启 mysqld 服务:systemctl restart mysqld3、使用 root 用户登录到 mysql:mysql -u root _mysql 5.7 默认生成一个随机密码
文章浏览阅读234次。题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]题解:回溯法package com.lcz.leetcode;import java.util.*;public class Leetcode46 { public List<List<Integer>> permute(int[] nums._leetcode 全排列js
文章浏览阅读5.3k次。1.时间表示pg中的LOCALTIMESTAMP(0),相当于oracle中的sysdate2.时间进行格式转换2.1 to_Char to_char(LOCALTIMESTAMP(0), 'YYYY-MM-DD HH24:MI:SS') as detect_time2.2 to_Date to_date('2018-03-12 18:47:35','yyyy-MM-dd') to_date(#{birthdate},'yyyy-MM-d..._postgres date
文章浏览阅读164次。首先,第一点是在html中嵌入swf文件 如下,在html中插入语句 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="500px" id="mapFlas..._thml 调用flex
文章浏览阅读1.2w次,点赞17次,收藏146次。排列熵算法(Permutation Entropy PE)出发点:用于脑电信号的信号判别,提取该排列熵特征,以区分不同的类其它突变信号检测方法:总结:1、傅里叶变换在全局上提供了信号整体奇异性的描述, 无法指出局部对整体奇异性的贡献, 因此无法定位突变发生的具体时刻2、短时傅里叶变换在给定的时间间隔和频率间隔内效果比较明显, 但对所有的频率都使用单一的窗函数, 分辨率保持不..._时间序列复杂度