ViewHolder
在ListView配合adapter显示数据的时候,原有形式会出现view组件重复创建,效率低下的问题。
ViewHolder的作用就是避免view的重复创建,用于缓存view组件。把需要重复加载的组件放在viewholder当中
public class MyAdapter extends BaseAdapter {
private List<Person> personList;
private Context context;
public MyAdapter(List<Person> personList, Context context){
this.personList=personList;
this.context=context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=null;
//1.获取子布局item
if (convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.layout_item,null);
//在第一次加载adapter的时候,创建viewholder。并把控件放入viewholder当中。
viewHolder=new ViewHolder();
viewHolder.textView=convertView.findViewById(R.id.tvName);
viewHolder.textViewDesc=convertView.findViewById(R.id.tvDesc);
//缓存viewholder
convertView.setTag(viewHolder);
}else{
//不是第一次加载的时候直接调用viewholder从缓存中读取控件
viewHolder= (ViewHolder) convertView.getTag();
}
//2.填充数据
Person person=personList.get(position);
viewHolder.textView.setText(person.getName());
viewHolder.textViewDesc.setText(person.getpDesc());
//3.
return convertView;
}
//可以给不同的item设置不同的viewholder,通过setTag(String,viewholder)但是前面的string要求一样所以通过
//设置values文件的string常量,就可以写R.id.mine
//在values中<type="id" name="mine">mine</>
class ViewHolder{
private TextView textView;
private TextView textViewDesc;
}
}
SmartRefreshLayout
智能刷新控件,能够实现下拉刷新,上拉加载更多。
RefreshHeader:下拉头部的实现和显示。
RefreshFooter:上拉底部的实现和显示。
基本用法:
xml文件:
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/srl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--添加刷新头样式-->
<com.scwang.smartrefresh.layout.header.BezierRadarHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!--<com.scwang.smartrefresh.header.PhoenixHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>-->
<!--imageview都是静态图片-->
<!--<pl.droidsonroids.gif.GifImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/img1"/>-->
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lvPerson" />
<!--添加底部加载样式-->
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
java:
//上划刷新
smartRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
refresh();
smartRefreshLayout.finishRefresh();
}
});
//下滑加载更多
smartRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
loadMore();
//加载完之后结束加载
smartRefreshLayout.finishLoadMore();
Log.e("123",personList.size()+"");
//当数据全部加载完成之后不可以再继续加载数据
if (personList.size()>10){
smartRefreshLayout.finishLoadMoreWithNoMoreData();
}else{
//当没有加载完更多数据时可以继续加载
smartRefreshLayout.finishLoadMore(false);
}
}
});
private void refresh(){
//先清空,清空的是数据
personList.clear();
//加新数据
personList.addAll(initData());//把集合中的数据重新添加到person对应的
personList=initData();//这样写是错误的,不能实现刷新数据,因为initData重新开辟了空间,person重新指向另一块空间,
//而adapter中person的指向还是没有变的,它指向的那块空间已经清空了
myProvider.notifyDataSetChanged();
}
private void loadMore(){
Person person=new Person();
person.setName("test");
person.setpDesc("des");
personList.add(person);
Person person1=new Person();
person1.setName("test");
person1.setpDesc("des");
personList.add(person1);
myProvider.notifyDataSetChanged();
}