[英]Android: Recyclerview onBindViewHolder and Snaphelper
我有一個附加的Recyclerview PagerSnapHelper,當我緩慢滾動Recyclerview時,onBindViewHolder被調用1次 ,但是當我快速滾動Recyclerview時,onBindViewHolder被連續2次調用。 滾動更改時,如何只在1次上使Adapter調用onBindViewHolder ? 對不起我的英語不好
您可以看到我的主要代碼:
public class DetailActiveVoucherAdapter extends RecyclerView.Adapter<DetailActiveVoucherAdapter.DetailViewHolder> {
// Constructor
// Var
private DetailViewHolder detailHolder; // i put viewholder here for using it after call api
private DataHolder<EvoucherDetailModel> dataHolderDetail;
private DataHolder<EVoucherSummary> dataHolderSummary;
public DetailActiveVoucherAdapter(...) {
// set constructor
}
@Override
public DetailViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.row_detail_active_voucher, parent, false);
return new DetailViewHolder(view);
}
@Override
public void onBindViewHolder(final DetailViewHolder holder, final int position) {
detailHolder = (DetailViewHolder) holder;
currentPosition = position;
holder.bind(); /**TODO: this is my problem */
/* problem is onBindViewHolder called 2 times successive. when i call holder.bind() i will call api, after calling api done, i show data on View
* But second onBindViewHolder is called, and current View is view of second position and first view has nothing
*/
}
...
private void loadData(long id, final long pos) {
DataLoader.getCashBoughtEvoucherDetail((LixiActivity) activity, new ApiCallBack() {
@Override
public void handleCallback(boolean isSuccess, Object object) {
if (isSuccess) {
detailHolder.evoucherModel = (EvoucherDetailModel) object;
loadTotalandPriceVoucher(pos);
} else {
Helper.showErrorDialog((LixiActivity) activity, (String) object);
}
}
}, id);
}
private void loadTotalandPriceVoucher(final long pos) {
DataLoader.getEVoucherSummary((LixiActivity) activity, new ApiCallBack() {
@Override
public void handleCallback(boolean isSuccess, Object object) {
if (onLoadingListener != null){
onLoadingListener.onEnd();
}
if (isSuccess) {
detailHolder.eVoucherSummary = (EVoucherSummary) object;
showData((int) pos);
}
}
}, detailHolder.evoucherModel.getMerchant_info().getId());
}
private void showData(int pos) {
// show data
}
public class DetailViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
// View
// this is 2 object i get from api
EvoucherDetailModel evoucherModel;
EVoucherSummary eVoucherSummary;
public DetailViewHolder(View itemView) {
super(itemView);
// reference view
}
public void bind(){
load();
// set event
}
}
}
這是我的方法。 我不使用recyclerview,而是使用普通視圖:imageview,textview等。 並讓用戶可以滾動,我使用onTouch事件自定義滾動。
linearDrag.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (canSwipe) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
cx = getWidth() / 2 - linearDrag.getWidth() / 2;
privotXLeft = getWidth() / 4 - linearDrag.getWidth() / 2;
privotXRight = (getWidth() / 4) * 3 - linearDrag.getWidth() / 2;
privotXCenter = linearDrag.getX();
x = motionEvent.getX();
break;
case MotionEvent.ACTION_MOVE:
changeX = motionEvent.getX();
linearDrag.setX(linearDrag.getX() + changeX - x);
break;
default:
// back to center
if ((linearDrag.getX() >= privotXCenter && linearDrag.getX() <= privotXRight) || (linearDrag.getX() >= privotXLeft && linearDrag.getX() <= privotXCenter)) {
linearDrag.setX(cx);
break;
}
// to next position
if (linearDrag.getX() <= privotXLeft) {
if (swipeNext) {
linearDrag.setX(-1 * getWidth());
if (onActionChangedListener != null) {
onActionChangedListener.onChanged(NEXT);
return true;
}
} else {
linearDrag.setX(cx);
}
break;
}
// to previous position
if (linearDrag.getX() >= privotXRight) {
if (swipePrev) {
linearDrag.setX(getWidth());
if (onActionChangedListener != null) {
onActionChangedListener.onChanged(PREV);
return true;
}
} else {
linearDrag.setX(cx);
}
break;
}
break;
}
return true;
} else {
return false;
}
}
});
onActionChangedListener是滾動結果的接口。 收到滾動結果后,我將調用api,重新加載數據並更新視圖。 我之所以使用這種方式,是因為我的視圖是分頁器視圖,同時它只顯示1頁。 如果與普通列表一起使用,它將毫無用處。 如果您有更好的方法,請與我分享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.