账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    请问我使用BRVAH加载更多的时候这样是不是会重复加载了?偶尔还会下标越界
    43
    0

    重点是在setLoadMoreData(String json)这个方法.
    类代码:

    public class WatchHistoryActivity extends BaseActivity implements View.OnClickListener, BaseQuickAdapter.RequestLoadMoreListener {
    
        @BindView(R.id.rv_watch_history)
        RecyclerView mRecyclerView;
        @BindView(R.id.rl_watch_history_empty_view)
        RelativeLayout mEmptyView;
        @BindView(R.id.rl_watch_history_loading)
        RelativeLayout mLoading;
    
        private static final String TAG = "WatchHistoryActivity";
        private static final int INIT_DATA_SUCCESS = 0;
        private static final int INIT_DATA_FAIL = 1;
        private static final int NETWORK_PROBLEM = 2;
        private static final int LOAD_MORE_FAIL = 3;
        private List<WatchHistoryBean> mDatas;
        private WatchHistoryAdapter mAdapter;
        private String mToken;
        private WatchHistoryHandler mHandler = new WatchHistoryHandler();
        private int mCurrentCounter;
        private boolean isErr = true;
        private int mSize = 1;
    
        @Override
        protected View initView() {
            View view = View.inflate(this, R.layout.activity_watch_history, null);
            ButterKnife.bind(this, view);
            mTvTitle.setText("观看历史");
            mIvBack.setImageResource(R.mipmap.back);
    //        mTvMore.setText("编辑");
            frameLayout.addView(view);
            return view;
        }
    
        @Override
        protected void initData() {
            mLoading.setVisibility(View.VISIBLE);
            mToken = PreferenceUtils.getString(this, "token");
            getInitData();
        }
    
        @Override
        protected void initEvent() {
            mIvBack.setOnClickListener(this);
        }
    
        /**
         * 获取初始列表数据
         */
        private void getInitData() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Response response = NetWorkRequestUtils.postRequest(ConstantsUtils.HEAD_URL + "/usercenter/favorite", new InitWatchHistoryObject());
                        if (response.isSuccessful()) {
                            String json = response.body().string();
                            Log.d(TAG, "获取初始化数据成功=  " + json);
                            setInitData(json);
                        } else {
                            Log.d(TAG, "获取初始化数据失败1111111111");
                            Message obtain = Message.obtain();
                            obtain.what = INIT_DATA_FAIL;
                            mHandler.sendMessage(obtain);
                        }
                    } catch (Exception e) {
                        Log.d(TAG, "获取初始化数据失败222222");
                        Message obtain = Message.obtain();
                        obtain.what = NETWORK_PROBLEM;
                        mHandler.sendMessage(obtain);
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * 设置初始化数据
         */
        private void setInitData(String json) {
            //处于子线程
            Gson gson = new Gson();
            WatchHistoryBean watchHistoryBean = gson.fromJson(json, WatchHistoryBean.class);
            List<WatchHistoryBean.DataBean> data = watchHistoryBean.getData();
            mDatas = new ArrayList<>();
            for (int i = 0; i < data.size(); i++) {
                WatchHistoryBean.DataBean dataBean = data.get(i);
                WatchHistoryBean bean = new WatchHistoryBean();
                String title = dataBean.getName();
                String date = dataBean.getUpdateTime();
                int watchCount = dataBean.getClick();
                String img = dataBean.getImg();
                String length = dataBean.getLenght();
                bean.setTitle(title);//标题
                bean.setWatchCont(watchCount + "");//观看数
                bean.setDate(date);//时间
                bean.setImgUrl(img);//封面
                bean.setTotalTime(length);//视频时长
                bean.setData(data);
                mDatas.add(bean);
            }
            Message obtain = Message.obtain();
            obtain.what = INIT_DATA_SUCCESS;
            mHandler.sendMessage(obtain);
        }
    
        @Override
        public void onLoadMoreRequested() {
            mRecyclerView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    getLoadMoreData();//联网获取加载更多数据
                }
            }, 1000);
        }
    
        private void getLoadMoreData() {
            mSize = mSize + 1;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Response response = NetWorkRequestUtils.postRequest(ConstantsUtils.HEAD_URL + "/usercenter/favorite", new MoreWatchHistoryObject());
                        if (response.isSuccessful()) {
                            String json = response.body().string();
                            Log.d(TAG, "获取加载更多数据成功= " + json);
                            setLoadMoreData(json);
                        } else {
                            Log.d(TAG, "获取加载更多数据失败111111111");
                            Message obtain = Message.obtain();
                            obtain.what = LOAD_MORE_FAIL;
                            mHandler.sendMessage(obtain);
                        }
                    } catch (Exception e) {
                        Log.d(TAG, "获取加载更多数据失败2222222222");
                        Message obtain = Message.obtain();
                        obtain.what = LOAD_MORE_FAIL;
                        mHandler.sendMessage(obtain);
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * 设置加载更多数据
         */
        private void setLoadMoreData(String json) {
            Gson gson = new Gson();
            WatchHistoryBean watchHistoryBean = gson.fromJson(json, WatchHistoryBean.class);
            final List<WatchHistoryBean.DataBean> data = watchHistoryBean.getData();
            mDatas = new ArrayList<>();
            final int totalCount = mCurrentCounter + data.size();//视频总条数
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (mCurrentCounter >= totalCount) {
                        //数据全部加载完毕
                        mAdapter.loadMoreEnd();
                    } else {
                        if (isErr) {
                            for (int i = 0; i < data.size(); i++) {
                                WatchHistoryBean.DataBean dataBean = data.get(i);
                                WatchHistoryBean bean = new WatchHistoryBean();
                                String title = dataBean.getName();
                                String date = dataBean.getUpdateTime();
                                int watchCount = dataBean.getClick();
                                String img = dataBean.getImg();
                                String length = dataBean.getLenght();
                                bean.setTitle(title);//标题
                                bean.setWatchCont(watchCount + "");//观看数
                                bean.setDate(date);//时间
                                bean.setImgUrl(img);//封面
                                bean.setTotalTime(length);//视频时长
                                bean.setData(data);//!必须设置data
                                mAdapter.addData(bean);
                                mDatas.add(bean);
                            }
                            //加载更多后position总数需要添加为和totalCount相同数目,否则会下标越界
                            for (int i = 0; i < totalCount; i++) {
                                WatchHistoryBean.DataBean dataBean = data.get(i);
                                data.add(dataBean);
                            }
                            mCurrentCounter = mAdapter.getData().size();
                            //主动调用加载完成,停止加载
                            mAdapter.loadMoreComplete();
                        } else {
                            //获取更多数据失败
                            isErr = true;
                            //同理,加载失败也要主动调用加载失败来停止加载(而且该方法会提示加载失败)
                            mAdapter.loadMoreFail();
                        }
                    }
                }
            });
        }
    
        private class WatchHistoryHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case INIT_DATA_SUCCESS://初始化数据成功
                        mLoading.setVisibility(View.GONE);
                        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(WatchHistoryActivity.this);
                        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                        mRecyclerView.setLayoutManager(linearLayoutManager);
                        mRecyclerView.addItemDecoration(new DividerItemDecoration(WatchHistoryActivity.this, 1));
                        mAdapter = new WatchHistoryAdapter(R.layout.item_watch_history, mDatas, WatchHistoryActivity.this);
                        mRecyclerView.setAdapter(mAdapter);
                        mAdapter.setOnLoadMoreListener(WatchHistoryActivity.this);
                        break;
                    case INIT_DATA_FAIL://初始化数据失败
                        mLoading.setVisibility(View.GONE);
                        Toast.makeText(WatchHistoryActivity.this, "获取数据失败", Toast.LENGTH_SHORT).show();
                        break;
                    case NETWORK_PROBLEM://网络错误
                        mLoading.setVisibility(View.GONE);
                        Toast.makeText(WatchHistoryActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
                        break;
                    case LOAD_MORE_FAIL://加载更多失败
                        mLoading.setVisibility(View.GONE);
                        Toast.makeText(WatchHistoryActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
            }
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.iv_back:
                    finish();
                    break;
                default:
                    break;
            }
        }
    
        /**
         * 初始化获取观看历史列表数据的对象
         */
        private class InitWatchHistoryObject {
            String token = mToken;
            String type = "2";
            int p = 1;
        }
    
        private class MoreWatchHistoryObject {
            String token = mToken;
            String type = "2";
            int p = mSize;
        }
    }
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 蜡笔大辛 普通会员 1楼

      BRVAH(Blinding Random Access Vector)是一种随机访问数组,它可以让你以更快的速度访问数组中的元素。在加载更多数据时,BRVAH通常比普通数组更快,因为它使用了预计算的数组索引。然而,如果你的数据量非常大,那么BRVAH可能会导致数据重复加载,因为新的元素可能没有被正确地存储在数组的中间位置。

      此外,BRVAH还可能导致下标越界。如果你尝试访问数组中的一个元素,但是下标超出了数组的范围,那么你可能会得到一个错误的结果。为了避免这种情况,你可以在访问元素之前检查下标是否在允许的范围内。

      总的来说,BRVAH是一个非常有用的数据加载技术,但是使用时需要谨慎,以避免出现上述问题。如果你遇到问题,建议你查阅BRVAH的官方文档,或者向BRVAH的开发者寻求帮助。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部