1. 程式人生 > >Android開發中XRecyclerview用法及遇到的一些問題

Android開發中XRecyclerview用法及遇到的一些問題

解決 pos sage head ebe 專業 剛才 adapt 只需要

目前通過xrecyclerview的開源代碼來實現系列功能,加載數據傳入type,值為1,2,3,分別表示初次加載,下拉刷新數據,上拉加載更多數據操作,刷新數據只需要重新放入數據,然後notifyDataSetChanged();即可.加載更多數據只需要在上拉時將獲取數據放入之前數據list中刷新數據即可.這麽說可能會比較抽象,下面通過代碼來具體給大家演示一下是如何實現的吧。

  核心代碼:

  首先需要配置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);

  }

  });

  從上面代碼可以看到,需要先設置下拉刷新和加載更多可執行,為true,然後設置它的加載樣式,有多種樣式可以選擇,具體參考xrecyclerview的github介紹,接下裏設置一下loadingListener即可.我們需要實現它的兩個方法:刷新回調方法onRefresh()和加載更多方法onLoadingMore(),即分別在這兩個方法中實現自己的刷新和加載數據邏輯即可.

  getWorksData(參數1,參數2)即為獲取後天數據的方法.參數1是指數據請求的次數,也指代請求後臺的數據頁數,初始化為1;參數2表示當前數據的操作模式(為1:初次請求數據,為2:刷新數據,為3:加載更多數據).

  loadingDialog.dismiss();

  creativeImageBean = JSONObject.parseObject(response, CreativeImageBean.class);

  if (creativeImageBean!=null && creativeImageBean.getCode() == 1000) {

  if(type==1){

  //是初次加載

  loge("初次加載數據");

  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("加載更多數據頁數==" + count+"---數據量--"+moreData.size());

  if (moreData != null && moreData.size() > 0) {

  data.addAll(moreData);

  loge("data加載更多數據後的地址=="+data.hashCode());

  loge("作品總數據長度==" + 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);//添加數據

  //如果添加moreData,為空是什麽原因

  } else {

  loge("moreData數據為空");

  // xRecyclerView.setLoadingMoreEnabled(false);

  // toast(getString(R.string.act_home_loadmore));

  xRecyclerView.loadMoreComplete();

  }

  }

  }

  刷新數據需要先清除原有數據,然後放入最新數據,接著調用adaper.motifyDataSetChange()方法.

  問題總覽

  點擊第i個item,提示卻是第i+1個item被點擊

  問題原因:xrecyclerrview默認添加的header和footer,這就導致item的真實位置發生了變化,

  解決方案:將item的位置由holder.getLayoutPosition()改為position就可以了,adapter中修改代碼如下:

  holder.itemView.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  //int pos = holder.getLayoutPosition();//點擊的item控件的位置

  myListener.onItemClick(holder.itemView, position);

  /*

  此方法返回的pos值與onBindViewHolder方法傳入的position值有可能不同。

  根據SDK中的解釋,在Recyclerview 進行添加、移除item等操作時,position位置可能會變化,

  而所有的adapter的刷新並不總是及時的,

  只有這個方法返回的才是當前item經過一些變換後所處的真正位置。

  */

  }

  });

  notifySetDataCahnged()無法刷新數據的問題:

  問題原因:先下拉刷新,然後上拉加載數據為空不顯示,因為data的地址發生了變化,數據的刷新是在adapter中實現的,並且是新建一個list,然後調用了list.addAll(data),導致刷新data數據地址改變,刷新無效

  解決方案:新建一個list對象moreData來專門接收下拉刷新的數據,並且摒棄adapter中的addNewData()方法,直接data.clear()—data.addAll(moreData)—adapter.notifyDataChanged()

  雖然內容有些多,但是只要大家按照剛才分享的源碼來一步一步的去做,都是可以做到的,如果還是存在不理解的地方,可以咨詢我們哦。

  本文由專業的鄭州app開發公司燚軒科技整理發布,原創不易,如需轉載請註明原文作者及出處。

Android開發中XRecyclerview用法及遇到的一些問題