-
Notifications
You must be signed in to change notification settings - Fork 150
BeamList
BeamListActivity & BeamListActivityPresenter &
BeamListFragment & BeamListFragmentPresenter
列表形式的Activity与Fragment模板。类MVVM模式。
##RecyclerView&ViewHolder
先忽略历史中的ListView。本框架采用了EasyRecyclerView来实现列表界面。
EasyRecyclerView的思想特性用法请看它的README。不再介绍。
它将Adapter与ViewHolder解耦合,使Adapter成为一个处理逻辑的类,正好放进Presenter。而ViewHolder则由View提供。
视图中的ItemView列表与Adapter的数据列表一一对应,这恰恰类似MVVM的双向绑定。后面只需在presenter里增删数据交给Adapter不用关心View层。
##API Activity&Fragment
两个面向Presenter的接口
-
stopRefresh()
停止刷新(仅UI) -
showError()
显示全屏的加载错误页面
三个回调
3.
public int getLayout(){
return 0;
}
提供供显示的layout。当你需要在View中添加修改布局的时候。重写这个方法返回你的layout。注意将你的EasyRecyclerView的id设置为
recycler
4.
protected ListConfig getConfig(){
return new ListConfig();
}
返回页面的设置。ListConfig提供了大量的自定义属性。并支持链式调用。在这里设置整个页面的配置。
最主要的就是setRefreshAble(true)
(是否开启下拉刷新)setLoadmoreAble(true)
(是否开启加载更多)setNoMoreAble(true)
(是否显示没有更多)这3个设置。其他的设置太多,,看函数名猜吧。。
public int getViewType(int position){
return 0;
}
一定不要用一个ViewHolder控制显示2套UI。分成2个ViewHolder写。在这里根据position区分不同的View类型。在getViewHolder中根据传入的viewtype返回不同的ViewHolder。
Presenter
在View层开启了下拉刷新和加载更多后。Presenter的这2个方法就在相应事件开始时被回调。在这里去进行你的数据加载。
@Override
public void onLoadMore() {
}
@Override
public void onRefresh() {
}
数据加载返回后。调用getAdapter()
即可获取到RecyclerArrayAdapter。然后这个Adapter任你处理。他的特性请去EasyRecyclerView看看。
##示例 Activity
@RequiresPresenter(QuestionPresenter.class)
public class QuestionActivity extends BeamListActivity<QuestionPresenter,Question> {
@Override
protected ListConfig getConfig() {
return super.getConfig()
.setRefreshAble(true)
.setNoMoreAble(true)
.setLoadmoreAble(true)
.setErrorAble(true)
.setErrorTouchToResumeAble(true);
}
//只需要在这里返回相应的ViewHolder即可。View的设置都在ViewHolder中实现。
@Override
protected BaseViewHolder getViewHolder(ViewGroup parent, int viewType) {
return new QuestionViewHolder(parent);
}
}
ViewHolder
public class QuestionViewHolder extends BaseViewHolder<Question> {
private TextView title;
private TextView name;
private SimpleDraweeView face;
private TextView date;
private TextView content;
private TextView answerCount;
private Question question;
public QuestionViewHolder(final ViewGroup parent) {
super(parent, R.layout.item_question);
title = $(R.id.title);
name = $(R.id.name);
face = $(R.id.face);
date = $(R.id.date);
content = $(R.id.content);
answerCount = $(R.id.answer);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(parent.getContext(),AnswerActivity.class);
i.putExtra("question",question);
parent.getContext().startActivity(i);
}
});
}
@Override
public void setData(Question data) {
question = data;
title.setText(data.getTitle());
name.setText(data.getAuthorName());
face.setImageURI(Uri.parse(data.getAuthorFace()));
answerCount.setText(data.getAnswerCount()+"个回答");
if(data.getRecent()!=null){
date.setText("最近回答 "+new JTimeTransform().parse("yyyy-MM-dd HH:mm:ss",data.getRecent()).toString(new RecentDateFormat()));
}else{
date.setText(new JTimeTransform().parse("yyyy-MM-dd HH:mm:ss",data.getDate()).toString(new RecentDateFormat()));
}
content.setText(data.getContent());
}
}
Presenter
public class QuestionPresenter extends BeamListActivityPresenter<QuestionActivity,Question> {
int page;
@Override
protected void onCreate(QuestionActivity view, Bundle savedState) {
super.onCreate(view, savedState);
onRefresh();
}
//加载更多时的回调
@Override
public void onLoadMore() {
QuestionModel.getInstance().getQuestionsFromServer(page, new DataCallback<QuestionResult>() {
@Override
public void success(String info, QuestionResult data) {
getAdapter().addAll(data.getQuestions());
if (data.getTotalPage()-1 == page)getAdapter().stopMore();
page++;
}
@Override
public void error(String errorInfo) {
JUtils.Log("onError:" + errorInfo);
getAdapter().pauseMore();
}
});
}
//下拉刷新时的回调
@Override
public void onRefresh() {
QuestionModel.getInstance().getQuestionsFromServer(0, new DataCallback<QuestionResult>() {
@Override
public void success(String info, QuestionResult data) {
getAdapter().clear();
getAdapter().addAll(data.getQuestions());
if (data.getTotalPage()-1 == page)getAdapter().stopMore();
page=1;
}
@Override
public void error(String errorInfo) {
getView().showError();//显示全屏的错误提示页面。
}
});
}
}