目前通過(guò)xrecyclerview的開(kāi)源代碼來(lái)實(shí)現(xiàn)系列功能,加載數(shù)據(jù)傳入type,值為1,2,3,分別表示初次加載,下拉刷新數(shù)據(jù),上拉加載更多數(shù)據(jù)操作,刷新數(shù)據(jù)只需要重新放入數(shù)據(jù),然后notifyDataSetChanged();即可.加載更多數(shù)據(jù)只需要在上拉時(shí)將獲取數(shù)據(jù)放入之前數(shù)據(jù)list中刷新數(shù)據(jù)即可.這么說(shuō)可能會(huì)比較抽象,下面讓鄭州app開(kāi)發(fā)公司燚軒科技通過(guò)代碼來(lái)具體給大家演示一下是如何實(shí)現(xiàn)的吧。
核心代碼:
首先需要配置xRecyclerview的屬性:
xRecyclerView.setPullRefreshEnabled(true);
xRecyclerView.setLoadingMoreEnabled(true);
xRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
xRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.Pacman);
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable(){
public void run() {
getWorksData(1,2);
}
}, 2000);
}
@Override
public void onLoadMore() {
count+=1;
loge("第幾次加載=="+count);
new Handler().postDelayed(new Runnable(){
public void run() {
getWorksData(count,3);
}
}, 2000);
}
});
從上面代碼可以看到,需要先設(shè)置下拉刷新和加載更多可執(zhí)行,為true,然后設(shè)置它的加載樣式,有多種樣式可以選擇,具體參考xrecyclerview的github介紹,接下里設(shè)置一下loadingListener即可.我們需要實(shí)現(xiàn)它的兩個(gè)方法:刷新回調(diào)方法onRefresh()和加載更多方法onLoadingMore(),即分別在這兩個(gè)方法中實(shí)現(xiàn)自己的刷新和加載數(shù)據(jù)邏輯即可.
getWorksData(參數(shù)1,參數(shù)2)即為獲取后天數(shù)據(jù)的方法.參數(shù)1是指數(shù)據(jù)請(qǐng)求的次數(shù),也指代請(qǐng)求后臺(tái)的數(shù)據(jù)頁(yè)數(shù),初始化為1;參數(shù)2表示當(dāng)前數(shù)據(jù)的操作模式(為1:初次請(qǐng)求數(shù)據(jù),為2:刷新數(shù)據(jù),為3:加載更多數(shù)據(jù)).
loadingDialog.dismiss();
creativeImageBean = JSONObject.parseObject(response, CreativeImageBean.class);
if (creativeImageBean!=null && creativeImageBean.getCode() == 1000) {
if(type==1){
//是初次加載
loge("初次加載數(shù)據(jù)");
data=creativeImageBean.getData().getList();
Message msg = Message.obtain(handler);
msg.what = GET_DATA;
handler.handleMessage(msg);
}else if(type==2){
//下拉刷新
//data = new ArrayList();
updateData=creativeImageBean.getData().getList();
count = 1;
loge("刷新了");
xRecyclerView.refreshComplete();
if (workAdapter != null) {
Message msg = Message.obtain(handler);
msg.what = UPDATE_DATA;
handler.sendMessage(msg);
} else {
Message msg = Message.obtain(handler);
msg.what = GET_DATA;
handler.sendMessage(msg);
}
}else if(type==3){
//加載更多
//moreData = new ArrayList();
moreData = creativeImageBean.getData().getList();
loge("加載更多數(shù)據(jù)頁(yè)數(shù)==" + count+"---數(shù)據(jù)量--"+moreData.size());
if (moreData != null && moreData.size() > 0) {
data.addAll(moreData);
loge("data加載更多數(shù)據(jù)后的地址=="+data.hashCode());
loge("作品總數(shù)據(jù)長(zhǎng)度==" + data.size());
// Message msg = Message.obtain(handler);
// msg.what = UPDATE_DATA;
// handler.sendMessage(msg);
if(workAdapter!=null){
loge("workAdapter不為空");
workAdapter.notifyDataSetChanged();
}else {
loge("workAdapter為空");
workAdapter = new WorksShowAdapter(MemoryWorksActivity.this,data);
xRecyclerView.setAdapter(workAdapter);
}
xRecyclerView.loadMoreComplete();
//workAdapter.addNewData(data);//添加數(shù)據(jù)
//如果添加moreData,為空是什么原因
} else {
loge("moreData數(shù)據(jù)為空");
// xRecyclerView.setLoadingMoreEnabled(false);
// toast(getString(R.string.act_home_loadmore));
xRecyclerView.loadMoreComplete();
}
}
}
刷新數(shù)據(jù)需要先清除原有數(shù)據(jù),然后放入最新數(shù)據(jù),接著調(diào)用adaper.motifyDataSetChange()方法.
問(wèn)題總覽
點(diǎn)擊第i個(gè)item,提示卻是第i+1個(gè)item被點(diǎn)擊
問(wèn)題原因:xrecyclerrview默認(rèn)添加的header和footer,這就導(dǎo)致item的真實(shí)位置發(fā)生了變化,
解決方案:將item的位置由holder.getLayoutPosition()改為position就可以了,adapter中修改代碼如下:
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//int pos = holder.getLayoutPosition();//點(diǎn)擊的item控件的位置
myListener.onItemClick(holder.itemView, position);
/*
此方法返回的pos值與onBindViewHolder方法傳入的position值有可能不同。
根據(jù)SDK中的解釋,在Recyclerview 進(jìn)行添加、移除item等操作時(shí),position位置可能會(huì)變化,
而所有的adapter的刷新并不總是及時(shí)的,
只有這個(gè)方法返回的才是當(dāng)前item經(jīng)過(guò)一些變換后所處的真正位置。
*/
}
});
notifySetDataCahnged()無(wú)法刷新數(shù)據(jù)的問(wèn)題:
問(wèn)題原因:先下拉刷新,然后上拉加載數(shù)據(jù)為空不顯示,因?yàn)閐ata的地址發(fā)生了變化,數(shù)據(jù)的刷新是在adapter中實(shí)現(xiàn)的,并且是新建一個(gè)list,然后調(diào)用了list.addAll(data),導(dǎo)致刷新data數(shù)據(jù)地址改變,刷新無(wú)效
解決方案:新建一個(gè)list對(duì)象moreData來(lái)專門接收下拉刷新的數(shù)據(jù),并且摒棄adapter中的addNewData()方法,直接data.clear()—data.addAll(moreData)—adapter.notifyDataChanged()
雖然內(nèi)容有些多,但是只要大家按照鄭州app開(kāi)發(fā)公司燚軒科技剛才分享的源碼來(lái)一步一步的去做,都是可以做到的,如果還是存在不理解的地方,可以咨詢我們哦。
s="MsoNormal"> ...
s="MsoNormal"> ...
亮度蒙版是影調(diào)調(diào)整的基石。它提供了一個(gè)簡(jiǎn)便的方法來(lái)選取圖...
s="p"> <span...
目前大家經(jīng)常會(huì)遇到摳圖的問(wèn)題,最多的就是摳人體、頭發(fā),摳...
請(qǐng)掃二維碼聯(lián)系客服
854221200@qq.com
185-3825-9583
QQ客服
關(guān)于  ·  招聘  ·  案例中心  ·  網(wǎng)站地圖
?@2018 燚軒科技版權(quán)所有 豫ICP備16015002號(hào)-4
百度提供搜索支持