CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.29k stars 5.15k forks source link

动画重复执行的时候adapter在加载更多数据的时候UI界面会闪动 #1595

Closed wangmingqiang closed 6 years ago

1109993488 commented 6 years ago

你说的闪动是重复执行动画?你是不是加载更多的时候调notifyDataSetChanged了?

1591

wangmingqiang commented 6 years ago

恩 是的 大神 我在加载出来更多数据的时候notifyDataSetChanged了

wangmingqiang commented 6 years ago

我设置动画可以执行多次 前期加载的20条数据是正常的(我用的是从左到右的动画) 在加载更多的时候拿到数据以后我就notifyDataSetChanged了,这时候界面上展示的效果就是当前的界面的item都会从左到右执行一次

wangmingqiang commented 6 years ago

package com.yidu.yidutool.activity;

import android.content.Context; import android.content.Intent; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener;

import com.base.sdk.net.http.BasicResponse; import com.base.sdk.net.http.RequestParams; import com.chad.library.adapter.base.BaseQuickAdapter; import com.yidu.yidutool.adapter.MyAroundpointAdapter; import com.yidu.yidutool.api.CommonAPI; import com.yidu.yidutool.common.Constants; import com.yidu.yidutool.common.Global; import com.yidu.yidutool.entity.AroundPoint; import com.yidu.yidutool.utils.JsonUtils; import com.yidu.yidutool.utils.NetUtils; import com.yidu.yidutool.utils.PrefUtils; import com.yidu.yidutool.utils.ToastUtils; import com.yidu.yidutool2.R;

import java.util.ArrayList; import java.util.List;

public class AroundPointListActivity2 extends BaseActivity implements OnClickListener {

private static final String TAG = "AroundPointListActivity";
public static final String EXTRA_LOC_LNG = "extra_loc_lng";
public static final String EXTRA_LOC_LAT = "extra_loc_lat";
public static final String EXTRA_LOC_CITY = "extra_loc_city";
public static final String EXTRA_LOC_ADDR = "extra_loc_addr";
private RecyclerView recyclerview;
private List<AroundPoint> mList = new ArrayList();
private ArrayList<AroundPoint> points;
private MyAroundpointAdapter adapter;
private double mLat, mLng;
private int mCityId;
private boolean isScrollDown;
private LinearLayoutManager layoutManager;

@Override
protected void setDataToTitle() {
    setTitleBarText(R.string.around_point_title);
}

@Override
protected void initView(View rootView) {
    initData();
    initListView();

}

private void initData() {
    mLat = getIntent().getDoubleExtra(EXTRA_LOC_LAT, 0);
    mLng = getIntent().getDoubleExtra(EXTRA_LOC_LNG, 0);
    mCityId = getIntent().getIntExtra(EXTRA_LOC_CITY, 0);
}

@Override
protected int getResourceId() {
    return R.layout.activity_aroundpoint_list;
}

private void initListView() {

    findViewById(R.id.ll_search_yidu_wd).setOnClickListener(this);
    recyclerview= (RecyclerView) findViewById(R.id.recyclerview);

    //创建布局管理
    layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerview.setLayoutManager(layoutManager);

    //创建适配器
    adapter=new MyAroundpointAdapter(R.layout.activity_aroundpoint_list_item, mList);

    //给RecyclerView设置适配器
    recyclerview.setAdapter(adapter);

    //动画
    adapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_LEFT);

    //设置是否只执行一次动画
    adapter.isFirstOnly(true);

    //条目点击事件
    adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
            AroundPoint point = mList.get(position);
            CarListActivity.startCarlistActivity(AroundPointListActivity2.this, Integer.valueOf(point.wd_id), "", point.wdtype, "");
        }
    });

    //预加载,自动加载
    recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {// RecyclerView已经停止滑动
                int lastVisibleItem;
                // 获取RecyclerView的LayoutManager

                // 获取到最后一个可见的item
                lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                // 获取item的总数
                int totalItemCount = layoutManager.getItemCount();
                //并且最后一个可见的item为最后一个item
                //并且是向下滑动
                if (lastVisibleItem >= totalItemCount - 1 && isScrollDown) {
                    // 此处调用加载更多回调接口的回调方法
                    loadData();
                }
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            isScrollDown = dy > 0;
        }
    });

// //上拉加载更多 // adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { // @Override // public void onLoadMoreRequested() { // loadData(); // } // },recyclerview);

    loadData();
}

private void loadData() {
    RequestParams params = new RequestParams();
    if (mLat != 0 || mLng != 0) {
        params.put("lat", mLng);
        params.put("lng", mLat);
    }
    String companyIds = PrefUtils.getString(Global.getInst().getUserCurrentChooseadCityId() + Constants.PREFS_CHOOSED_COMPANY_IDS);
    if (!TextUtils.isEmpty(companyIds)) {
        params.put("company_ids", companyIds);
    }
    params.put("city_id", mCityId);
    params.put("start", mList.size());
    params.put("offset", Constants.OFFSET);
    params.put("company_ids", PrefUtils.getString(Global.getInst().getUserCurrentChooseadCityId() + Constants.PREFS_CHOOSED_COMPANY_IDS));
    NetUtils.request(Constants.AROUND_POINT_LIST_RELATIVE_URL, params, new NetUtils.OnFinishCallBack() {
        @Override
        public void onSuccess(CommonAPI.CommonBasicResponse response) {
            points = JsonUtils.fromJsonToArrayList(response.data, AroundPoint.class);

            //加载完成(注意不是加载结束,而是本次数据加载结束并且还有下页数据)不设置的话只能加载一次的数据
            adapter.loadMoreComplete();

            if (mList.size() == 0){
                mList.addAll(points);
            } else {
                for (AroundPoint point : points) {
                    if (mList.contains(point)){
                        continue;
                    }else {
                        mList.add(point);
                    }
                }

            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFault(BasicResponse response) {
            ToastUtils.showShortToast(response.msg);
        }

        @Override
        public void onOther(BasicResponse response) {
            ToastUtils.showShortToast(response.msg);
        }
    });
}

@Override
public void onClick(View v) {
    int id = v.getId();
    if (id == R.id.ib_title_bar_left) {
        finish();
    } else if (id == R.id.ib_title_bar_right) {
        finish();
    } else if (id == R.id.ll_search_yidu_wd) {
        SearchYiduPointActiviity.startIntent(this, (ArrayList) mList);
    }
}

public static void startIntent(Context ctx, double lng, double lat, int cityId) {
    Intent intent = new Intent(ctx, AroundPointListActivity2.class);
    intent.putExtra(EXTRA_LOC_LNG, lng);
    intent.putExtra(EXTRA_LOC_LAT, lat);
    intent.putExtra(EXTRA_LOC_CITY, cityId);
    ctx.startActivity(intent);
}

}

1109993488 commented 6 years ago

你可以用BaseQuickAdapter提供的addData方法,如果自己控制就需要用notifyItemRangeChanged,而不能用notifyDataSetChanged

wangmingqiang commented 6 years ago

完美解决 很感谢 这个很吊的库 以后就是他了