Skip to content
KirinRyuuri edited this page Aug 23, 2015 · 14 revisions

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层。 list

##API Activity&Fragment

两个面向Presenter的接口

  1. stopRefresh()停止刷新(仅UI)
  2. 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();//显示全屏的错误提示页面。
            }

        });
    }
}
Clone this wiki locally