ListView列表
老版本
public View oldGetView(int position, View convertView, ViewGroup parent) {
//返回每一个item
//拿到布局
if (convertView==null)
convertView = LayoutInflater.from(context).inflate(R.layout.my_list_view, parent, false);
//find会耗时需要优化
TextView textView = convertView.findViewById(R.id.tv);
textView.setText(data.get(position).getName());
Log.e("gh", "getView: "+position);
return convertView;
}
//次方法为为每行添加值
在老版本方法中,findbyId每次都会带来能耗
100个item则会创建100次find
新版本(性能优化)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView==null){
viewHolder=new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.my_list_view, parent, false);
viewHolder.textView=convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
}else {
viewHolder=(ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(data.get(position).getName());
Log.e("gh", "getView: "+position);
return convertView;
}
private final class ViewHolder{
TextView textView;
}
}
//这里只用了一次findbyid
实际上getTag的源码意义就是存储数据集一次存
RecyclerView
1导包
// 添加recyclerview依赖
implementation 'androidx.recyclerview:recyclerview:1.3.2'
相较与LIstView recycler必须使用holder 并且在布局上没有默认,需要加上布局更加灵活
动画
帧动画
这还不行需要启动和停止
private boolean flag=true;//动画启动和停止
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
RelativeLayout relativeLayout = findViewById(R.id.rl);
AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
获取动画
relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag){
//点击启动
anim.start();
flag=false;
}else{
//点击关闭
anim.stop();
flag=true;
}
}
});
}
补间动画
属性动画
单位和尺寸
用dp sp
ViewPager