Skip to content
Jude edited this page Apr 9, 2016 · 14 revisions

BeamListActivity & BeamListActivityPresenter &
BeamListFragment & BeamListFragmentPresenter

列表形式的Activity与Fragment模板。
list
例如这样的列表界面。使用本模板即可将工作量简化到极致。

##RecyclerView&ViewHolder 先忽略历史中的ListView。本框架采用了EasyRecyclerView来实现列表界面。
EasyRecyclerView的思想特性用法请看它的README。不再介绍。
它将Adapter与ViewHolder解耦合,使Adapter成为一个处理逻辑的类,正好放进Presenter。而ViewHolder则由View提供。 视图中的ItemView列表与Adapter的数据列表一一对应,这恰恰类似MVVM的双向绑定。后面只需在presenter里增删数据交给Adapter不用关心View层。 list

##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

  1. void stopRefresh()停止刷新(仅UI)
  2. void showError()显示全屏的加载错误页面
  3. 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());
    }
}
Clone this wiki locally