1 . recycleview 限定item数量
我们有时候会遇到这类需求,要求某个列表,当列表里面当数量超过10条后,就显示前10条数据。如果不到10条就显示全部数据。对于一个recycleview,我们可以对传入adapter的数据源进行设置。在Java里面,对于集合list,我们可以通过list.subList(X1 , X2 )来设置list的长度。
newlist = knowledgeInfoList.subList(0, 10);
设置后,将新的list传入给adapter。
private void initAdapter() {
if (weeksettlementAdapter == null) {
/**
* item超过10条以后显示省略号
*/
if (settleBean != null && settleBean.getKnowledgeInfoList() != null
&& settleBean.getKnowledgeInfoList().size() > 10) {
ellipsis.setVisibility(View.VISIBLE);
/**
* 截取前10条信息传入
*/
List<KnowledgeInfoListBean> newlist = knowledgeInfoList.subList(0, 10);
weeksettlementAdapter = new WeeksettlementAdapter(newlist);
} else { // item10条以内
ellipsis.setVisibility(View.GONE);
weeksettlementAdapter = new WeeksettlementAdapter(knowledgeInfoList);
}
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
RecyclerView.setLayoutManager(manager);
RecyclerView.setNestedScrollingEnabled(false);
RecyclerView.setAdapter(weeksettlementAdapter);
}
}
2.单页面接收多页面传参
在实际开发中,单一页面,会从其他页面接受参数,但是这个参数可能来自不同页面,来自不同页面后,逻辑是不一样的。
这个时候我们可以在传参中增加一个boolean值/int值,用于区分。
public void initBundle() {
week = getIntent().getBooleanExtra("fromweek", true);
if (week) { // week为true 说明是从周报接受的数据
outbtnlayaout.setVisibility(View.GONE);
settleBean = (RowsBean) getIntent().getSerializableExtra("weekbean");
showShareView();
} else { // 首页过来的
homeBundle();
outbtnlayaout.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) nestScrollview.getLayoutParams();
lp.bottomMargin = DensityUtil.dp2px(56);
nestScrollview.setLayoutParams(lp);
}
}
3.对于请求数据和刷新数据,要在一个线程中执行
对于数据请求和刷新数据,最好在一个线程中执行,最好都在子线程中去执行。
holder.mRelativeGroupMain.setOnClickListener(v -> {
onGroupClickListener.onClick(groupIndex);
if (groupBean.errQuestionInfoList != null) {
if (groupList.get(groupIndex).show) {
if (isExpanded(groupIndex)) {
collapseGroup(groupIndex); // 关闭方法
} else {
expandGroup(groupIndex); // 展开方法
scrollItemBottomListener.scrollView(groupIndex);}
} else {
collapseGroup(groupIndex); // 关闭方法
}
} else {
netRequest(groupIndex);
notifyGroupChanged(groupIndex);
}
});
请求接口数据
private void netRequest(int index, ImageView imageView, RelativeLayout relativeLayout) {
LoadingDialogUtils.getInstance().showLoadingDialog(mContext);
String knowledgelist = groupList.get(index).errKnowledgeInfo.knowledgeId; // 要求传入点击位置的knowledgeid
new ErrorListRequest(knowledgelist).enqueue(new NetCallback<List<ErrQuestionInfoListBean>>() {
@Override
public void onSuccess(List<ErrQuestionInfoListBean> errQuestionInfoListBeans) {
LoadingDialogUtils.getInstance().dismissDialog(); groupList.get(index).setErrQuestionInfoList(errQuestionInfoListBeans);
groupList.get(index).setShow(true);
expandGroup(index, imageView, relativeLayout);
}
@Override
public void onError(ClHttpException e, String s) {
LoadingDialogUtils.getInstance().dismissDialog();
}
});
}
在上面第一段代码中,在执行netRequest(groupIndex)后,会走子线程,执行第二段代码;但是主线程中依旧会执行notifyGroupChanged(groupIndex),这会导致点击时,请求的数据还未返回,但是已经执行到刷新数据,因此点击第一次时候刷新的数据为空,第二次点击时候,子线程请求的数据已经收到了,刷新数据,进而有了数据。
正确方案:直接在请求数据中,更新数据,都在子线程中执行操作。
private void netRequest(int index, ImageView imageView, RelativeLayout relativeLayout) {
LoadingDialogUtils.getInstance().showLoadingDialog(mContext);
String knowledgelist = groupList.get(index).errKnowledgeInfo.knowledgeId; // 要求传入点击位置的knowledgeid
new ErrorListRequest(knowledgelist).enqueue(new NetCallback<List<ErrQuestionInfoListBean>>() {
@Override
public void onSuccess(List<ErrQuestionInfoListBean> errQuestionInfoListBeans) {
LoadingDialogUtils.getInstance().dismissDialog();
groupList.get(index).setErrQuestionInfoList(errQuestionInfoListBeans);
groupList.get(index).setShow(true);
expandGroup(index, imageView, relativeLayout);
notifyGroupChanged(index); // 刷新group数据,包括group里面的child数据
}
@Override
public void onError(ClHttpException e, String s) {
LoadingDialogUtils.getInstance().dismissDialog();
}
});
}