请问我使用BRVAH加载更多的时候这样是不是会重复加载了?偶尔还会下标越界

202005021116 应用层 2018-03-26 05:55:16
重点是在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;
}
}
...全文
466 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
键盘舞者113 2018-03-27
  • 打赏
  • 举报
回复
这段代码未核实 data添加自己的元素,我觉得应该是 mDatas.add(dataBean) for (int i = 0; i < totalCount; i++) { WatchHistoryBean.DataBean dataBean = data.get(i); data.add(dataBean); }
202005021116 应用层 2018-03-27
  • 打赏
  • 举报
回复
引用 1 楼 z979451341 的回复:
你是已经出现这钟问题了吗,自己先测一测再说,
测了好多次了,会下标越界,就是不知道应该哪里把获取到的更多数据添加进去
键盘舞者113 2018-03-27
  • 打赏
  • 举报
回复
你是已经出现这钟问题了吗,自己先测一测再说,

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧