-
Notifications
You must be signed in to change notification settings - Fork 150
BeamList
BeamListActivity & BeamListActivityPresenter &
BeamListFragment & BeamListFragmentPresenter
列表形式的Activity与Fragment模板。
例如这样的列表界面。使用本模板即可将工作量简化到极致。
##RecyclerView&ViewHolder
先忽略历史中的ListView。本框架采用了EasyRecyclerView来实现列表界面。
EasyRecyclerView的思想特性用法请看它的README。不再介绍。
它将Adapter与ViewHolder解耦合,使Adapter成为一个处理逻辑的类,正好放进Presenter。而ViewHolder则由View提供。
视图中的ItemView列表与Adapter的数据列表一一对应,这恰恰类似MVVM的双向绑定。后面只需在presenter里增删数据交给Adapter不用关心View层。
##API
###Activity&Fragment
#####提供ViewHolder
protected abstract BaseViewHolder getViewHolder(ViewGroup parent,int viewType);
必须实现这个方法。返回你的ViewHolder。
#####页面的配置
1.
public int getLayout(){
return 0;
}
重写这个方法可以提供供显示的layout。当你需要在View中添加修改布局的时候。重写这个方法返回你的layout。注意将你的EasyRecyclerView的id设置为
recycler
2.
protected ListConfig getConfig(){
return new ListConfig();
}
重写这个方法可以在这里设置整个页面的配置。ListConfig提供了大量的自定义属性。并支持链式调用。
最主要的就是setRefreshAble(true)
(是否开启下拉刷新)setLoadmoreAble(true)
(是否开启加载更多)setNoMoreAble(true)
(是否显示没有更多)这3个设置。其他的设置太多,,看函数名猜吧。。
ListConfig.setDefaultListConfig(ListConfig config)
方法给全局设置默认的ListConfig。
public int getViewType(int position){
return 0;
}
重写这个方法可以控制ViewType。一定不要用一个ViewHolder控制显示2套UI。分成2个ViewHolder写。在这里根据position区分不同的View类型。在getViewHolder中根据传入的viewtype返回不同的ViewHolder。
#####面向Presenter的API
-
void stopRefresh()
停止刷新(仅UI) -
void showError()
显示全屏的加载错误页面 -
EasyRecyclerView getListView()
获取EasyRecyclerView示例进行更多操作。
###Presenter 在View层开启了下拉刷新和加载更多后。Presenter的这2个方法就在相应事件开始时被回调。在这里去进行你的数据加载。
@Override
public void onLoadMore() {
}
@Override
public void onRefresh() {
}
数据加载返回后。调用getAdapter()
即可获取到RecyclerArrayAdapter。然后这个Adapter任你处理。他的特性请去EasyRecyclerView看看。
#####Rx订阅
同样支持Rx订阅。getRefreshSubscriber()
与getMoreSubscriber()
返回2个Subscriber。只需将刷新与加载更多的返回绑定到对应的Subscriber即可自动处理一系列业务逻辑。如果使用了加载更多,会自动管理页数,从0开始。getCurPage()获取当前页数。
一定要使用unsafeSubscribe
@Override
public void onLoadMore() {
BlogModel.getInstance().getSeed(id,getCurPage()).unsafeSubscribe(getMoreSubscriber());
}
@Override
public void onRefresh() {
BlogModel.getInstance().getSeed(id,0).unsafeSubscribe(getRefreshSubscriber());
}
##示例 #####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> {
@Override
protected void onCreate(QuestionActivity view, Bundle savedState) {
super.onCreate(view, savedState);
onRefresh();//一般启动时需要自己手动开始刷新
}
@Override
public void onLoadMore() {
QuestionModel.getInstance().getQuestions(getCurPage()).unsafeSubscribe(getMoreSubscriber());
}
@Override
public void onRefresh() {
QuestionModel.getInstance().getQuestions(0).unsafeSubscribe(getRefreshSubscriber());
}
}