ViewHolder
在ListView配合adapter顯示數(shù)據(jù)的時候银伟,原有形式會出現(xiàn)view組件重復(fù)創(chuàng)建蓬抄,效率低下的問題丰嘉。
ViewHolder的作用就是避免view的重復(fù)創(chuàng)建,用于緩存view組件嚷缭。把需要重復(fù)加載的組件放在viewholder當(dāng)中
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的時候饮亏,創(chuàng)建viewholder。并把控件放入viewholder當(dāng)中阅爽。
viewHolder=new ViewHolder();
viewHolder.textView=convertView.findViewById(R.id.tvName);
viewHolder.textViewDesc=convertView.findViewById(R.id.tvDesc);
//緩存viewholder
convertView.setTag(viewHolder);
}else{
//不是第一次加載的時候直接調(diào)用viewholder從緩存中讀取控件
viewHolder= (ViewHolder) convertView.getTag();
}
//2.填充數(shù)據(jù)
Person person=personList.get(position);
viewHolder.textView.setText(person.getName());
viewHolder.textViewDesc.setText(person.getpDesc());
//3.
return convertView;
}
//可以給不同的item設(shè)置不同的viewholder路幸,通過setTag(String,viewholder)但是前面的string要求一樣所以通過
//設(shè)置values文件的string常量,就可以寫R.id.mine
//在values中<type="id" name="mine">mine</>
class ViewHolder{
private TextView textView;
private TextView textViewDesc;
}
}
SmartRefreshLayout
智能刷新控件付翁,能夠?qū)崿F(xiàn)下拉刷新简肴,上拉加載更多。
RefreshHeader:下拉頭部的實現(xiàn)和顯示百侧。
RefreshFooter:上拉底部的實現(xiàn)和顯示砰识。
基本用法:
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都是靜態(tài)圖片-->
<!--<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();
//加載完之后結(jié)束加載
smartRefreshLayout.finishLoadMore();
Log.e("123",personList.size()+"");
//當(dāng)數(shù)據(jù)全部加載完成之后不可以再繼續(xù)加載數(shù)據(jù)
if (personList.size()>10){
smartRefreshLayout.finishLoadMoreWithNoMoreData();
}else{
//當(dāng)沒有加載完更多數(shù)據(jù)時可以繼續(xù)加載
smartRefreshLayout.finishLoadMore(false);
}
}
});
private void refresh(){
//先清空能扒,清空的是數(shù)據(jù)
personList.clear();
//加新數(shù)據(jù)
personList.addAll(initData());//把集合中的數(shù)據(jù)重新添加到person對應(yīng)的
personList=initData();//這樣寫是錯誤的,不能實現(xiàn)刷新數(shù)據(jù)辫狼,因為initData重新開辟了空間初斑,person重新指向另一塊空間,
//而adapter中person的指向還是沒有變的膨处,它指向的那塊空間已經(jīng)清空了
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();
}