Android的listview添加頭和腳的另一種方式

給listview和recyclerview添加header和footer,我們一般常用的方式,有如下幾種:
xml文件:


1.自定義listview和recyclerview.添加頭和尾
2.使用第三方框架PullToRefresh進(jìn)行添加頭和尾
3.使用谷歌最新推出的控件SwipeRefreshLayout,下面我們就來講解一下怎么使用谷歌最新的特性進(jìn)行添加頭和尾
該控件有一個(gè)缺點(diǎn):自帶功能中沒有添加叫布局加載更多的方法.
上圖:


只需要添加下拉加載更多的話,直接使用原生的控件即可:
上代碼:
privateListViewlv;
privateArrayListlist=newArrayList<>();
privateListviewAdaptermAdapter;
privateSwipeRefreshLayoutswipe;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv_listview);
swipe= (SwipeRefreshLayout) findViewById(R.id.swipe);
init();
//設(shè)置下拉刷新的顏色
swipe.setProgressBackgroundColorSchemeResource(android.R.color.holo_red_light);
//下拉時(shí)觸發(fā)SwipeRefreshLayout的下拉動(dòng)畫檩奠,動(dòng)畫完畢之后就會(huì)回調(diào)這個(gè)方法
swipe.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {
@Override
public voidonRefresh() {
//開始刷新酵幕,設(shè)置當(dāng)前為刷新狀態(tài)
//swipeRefreshLayout.setRefreshing(true);
//這里是主線程
//一些比較耗時(shí)的操作,比如聯(lián)網(wǎng)獲取數(shù)據(jù)菠镇,需要放到子線程去執(zhí)行
//TODO獲取數(shù)據(jù)
finalRandom random =newRandom();
newHandler().postDelayed(newRunnable() {
@Override
public voidrun() {
list.add(0,"我是刷新天才"+random.nextInt(100) +"號(hào)");
mAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this,"刷新了一條數(shù)據(jù)", Toast.LENGTH_SHORT).show();
//加載完數(shù)據(jù)設(shè)置為不刷新狀態(tài)昂秃,將下拉進(jìn)度收起來
swipe.setRefreshing(false);
}
},2000);
}
});
}
/**
*@authorhy
@time2016/10/1 17:57
/
private voidinit() {
addData();
if(list!=null) {
if(mAdapter==null) {
mAdapter=newListviewAdapter(this,list);
lv.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
}
}
/

*@authorhy
@time2016/10/1 17:57
/
public voidaddData() {
for(inti =1; i <=100; i++) {
list.add("我是天才"+ i +"號(hào)");
}
}
xml布局文件:
就是一個(gè)swipeRefreshLayout里面包裹一個(gè)listview即可.
添加footer,上啦加載更多,自定義該控件.
/

*作者:hy on 2016/10/2 00:02
郵箱: simoncqhy@163.com
/
public classSwipeRefreshViewextendsSwipeRefreshLayout {
privateViewmFooterView;
//滑動(dòng)的最小距離
private intmSlop;
//獲取listview
privateListViewmListView;
privateOnLoadListenermOnLoadListener;
//正在加載狀態(tài)
private booleanisLoading;
publicSwipeRefreshView(Context context) {
this(context,null);
}
publicSwipeRefreshView(Context context, AttributeSet attrs) {
super(context, attrs);
mFooterView= View.inflate(context, R.layout.view_footer,null);
//設(shè)置滑動(dòng)的最小距離,大于該距離才能滑動(dòng)禀梳。
mSlop= ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
protected voidonLayout(booleanchanged,intleft,inttop,intright,intbottom) {
super.onLayout(changed, left, top, right, bottom);
if(mListView==null) {
//判斷容器有多少個(gè)子孩子
if(getChildCount()>0) {
//判斷第一個(gè)孩子是不是ListView
if(getChildAt(0)instanceofListView) {
//創(chuàng)建ListView對(duì)象
mListView= (ListView) getChildAt(0);
//設(shè)置ListView的滑動(dòng)監(jiān)聽
setListViewOnScroll();
}
}
}
}
//設(shè)置listview的滑動(dòng)監(jiān)聽
private voidsetListViewOnScroll() {
mListView.setOnScrollListener(newAbsListView.OnScrollListener() {
@Override
public voidonScrollStateChanged(AbsListView view,intscrollState) {
//移動(dòng)過程中判斷時(shí)候能下拉加載更多
if(canLoadMore()) {
//加載數(shù)據(jù)
loadData();
}
}
@Override
public voidonScroll(AbsListView view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {
}
});
}
/

*分發(fā)事件的處理
*@paramev
@return
/
private floatmDownY,mUpY;
@Override
public booleandispatchTouchEvent(MotionEvent ev) {
switch(ev.getAction()) {
caseMotionEvent.ACTION_DOWN:
//移動(dòng)的起點(diǎn)
mDownY= ev.getY();
break;
caseMotionEvent.ACTION_MOVE:
//移動(dòng)過程中判斷時(shí)候能下拉加載更多
if(canLoadMore()) {
//加載數(shù)據(jù)
loadData();
}
break;
caseMotionEvent.ACTION_UP:
//移動(dòng)的終點(diǎn)
mUpY= getY();
break;
}
return super.dispatchTouchEvent(ev);
}
/

*判斷是否能夠加載更多
@return
/
private booleancanLoadMore() {
// 1.是上拉狀態(tài)
booleancondition1 = (mDownY-mUpY) >=mSlop;
if(condition1) {
System.out.println("是上拉狀態(tài)");
}
// 2.當(dāng)前頁面可見的item是最后一個(gè)條目
booleancondition2 =false;
if(mListView!=null&&mListView.getAdapter() !=null) {
condition2 =mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1);
}
if(condition2) {
System.out.println("是最后一個(gè)條目");
}
// 3.正在加載狀態(tài)
booleancondition3 = !isLoading;
if(condition3) {
System.out.println("不是正在加載狀態(tài)");
}
returncondition1 && condition2 && condition3;
}
/

處理加載數(shù)據(jù)的邏輯
/
private voidloadData() {
System.out.println("加載數(shù)據(jù)...");
if(mOnLoadListener!=null) {
//設(shè)置加載狀態(tài)杜窄,讓布局顯示出來
setLoading(true);
mOnLoadListener.onLoad();
}
}
/

*設(shè)置加載狀態(tài),是否加載傳入boolean值進(jìn)行判斷

@paramloading
/
public voidsetLoading(booleanloading) {
//修改當(dāng)前的狀態(tài)
isLoading= loading;
if(isLoading) {
//顯示布局
mListView.addFooterView(mFooterView);
}else{
//隱藏布局
mListView.removeFooterView(mFooterView);
//重置滑動(dòng)的坐標(biāo)
mDownY=0;
mUpY=0;
}
}
/

上拉加載的接口回調(diào)
/
public interfaceOnLoadListener {
voidonLoad();
}
public voidsetOnLoadListener(OnLoadListener listener) {
this.mOnLoadListener= listener;
}
}
使用:
/

*作者:hy on 2016/10/2 00:16
郵箱: simoncqhy@163.com
/
public classCustomActivityextendsAppCompatActivity {
privateListmList;
private intmCount;
privateStringAdaptermAdapter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
finalSwipeRefreshView swipeRefreshView = (SwipeRefreshView) findViewById(R.id.srl);
finalListView listView = (ListView) findViewById(R.id.lv);
//設(shè)置適配器數(shù)據(jù)
mList=newArrayList<>();
for(inti =0; i <30; i++) {
mList.add("我是天才"+ i +"號(hào)");
mCount++;
}
mAdapter=newStringAdapter();
listView.setAdapter(mAdapter);
//不能在onCreate中設(shè)置算途,這個(gè)表示當(dāng)前是刷新狀態(tài)塞耕,如果一進(jìn)來就是刷新狀態(tài),SwipeRefreshLayout會(huì)屏蔽掉下拉事件
//swipeRefreshLayout.setRefreshing(true);
//設(shè)置顏色屬性的時(shí)候一定要注意是引用了資源文件還是直接設(shè)置16進(jìn)制的顏色嘴瓤,因?yàn)槎际莍nt值容易搞混
//設(shè)置下拉進(jìn)度的背景顏色扫外,默認(rèn)就是白色的
swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white);
//設(shè)置下拉進(jìn)度的主題顏色
swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
//下拉時(shí)觸發(fā)SwipeRefreshLayout的下拉動(dòng)畫,動(dòng)畫完畢之后就會(huì)回調(diào)這個(gè)方法
swipeRefreshView.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {
@Override
public voidonRefresh() {
//開始刷新廓脆,設(shè)置當(dāng)前為刷新狀態(tài)
//swipeRefreshLayout.setRefreshing(true);
//這里是主線程
//一些比較耗時(shí)的操作筛谚,比如聯(lián)網(wǎng)獲取數(shù)據(jù),需要放到子線程去執(zhí)行
//TODO獲取數(shù)據(jù)
finalRandom random =newRandom();
newHandler().postDelayed(newRunnable() {
@Override
public voidrun() {
mList.add(0,"我是下拉天才"+random.nextInt(100) +"號(hào)");
mAdapter.notifyDataSetChanged();
Toast.makeText(CustomActivity.this,"刷新了一條數(shù)據(jù)", Toast.LENGTH_SHORT).show();
//加載完數(shù)據(jù)設(shè)置為不刷新狀態(tài)停忿,將下拉進(jìn)度收起來
swipeRefreshView.setRefreshing(false);
}
},2000);
}
});
//設(shè)置下拉加載更多
swipeRefreshView.setOnLoadListener(newSwipeRefreshView.OnLoadListener() {
@Override
public voidonLoad() {
newHandler().postDelayed(newRunnable() {
@Override
public voidrun() {
//添加數(shù)據(jù)
for(inti =30; i <35; i++) {
mList.add("我是加載更多天才"+ i+"號(hào)");
//這里要放在里面刷新驾讲,放在外面會(huì)導(dǎo)致刷新的進(jìn)度條卡住
mAdapter.notifyDataSetChanged();
}
Toast.makeText(CustomActivity.this,"加載了"+5+"條數(shù)據(jù)", Toast.LENGTH_SHORT).show();
//加載完數(shù)據(jù)設(shè)置為不加載狀態(tài),將加載進(jìn)度收起來
swipeRefreshView.setLoading(false);
}
},2000);
}
});
}
/

*適配器
*/
private classStringAdapterextendsBaseAdapter {
@Override
public intgetCount() {
returnmList.size();
}
@Override
publicObject getItem(intposition) {
returnmList.get(position);
}
@Override
public longgetItemId(intposition) {
returnposition;
}
@Override
publicView getView(intposition, View convertView, ViewGroup parent) {
if(convertView ==null) {
convertView = View.inflate(CustomActivity.this, android.R.layout.simple_list_item_1,null);
}
TextView tv = (TextView) convertView;
tv.setGravity(Gravity.CENTER);
tv.setPadding(0,20,0,20);
tv.setText(mList.get(position));
returnconvertView;
}
}
}
源碼下載地址
百度云盤:
http://pan.baidu.com/s/1eRU3mpG

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末席赂,一起剝皮案震驚了整個(gè)濱河市吮铭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氧枣,老刑警劉巖沐兵,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異便监,居然都是意外死亡扎谎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門烧董,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毁靶,“玉大人,你說我怎么就攤上這事逊移≡み海” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵胳泉,是天一觀的道長(zhǎng)拐叉。 經(jīng)常有香客問我,道長(zhǎng)扇商,這世上最難降的妖魔是什么凤瘦? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮案铺,結(jié)果婚禮上蔬芥,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好笔诵,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布返吻。 她就那樣靜靜地躺著,像睡著了一般乎婿。 火紅的嫁衣襯著肌膚如雪测僵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天次酌,我揣著相機(jī)與錄音恨课,去河邊找鬼。 笑死岳服,一個(gè)胖子當(dāng)著我的面吹牛剂公,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吊宋,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼纲辽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了璃搜?” 一聲冷哼從身側(cè)響起拖吼,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎这吻,沒想到半個(gè)月后吊档,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唾糯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年怠硼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移怯。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡香璃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舟误,到底是詐尸還是另有隱情葡秒,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布嵌溢,位于F島的核電站眯牧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赖草。R本人自食惡果不足惜炸站,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疚顷。 院中可真熱鬧,春花似錦、人聲如沸腿堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笆檀。三九已至忌堂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酗洒,已是汗流浹背士修。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留樱衷,地道東北人棋嘲。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矩桂,于是被迫代替她去往敵國(guó)和親沸移。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容