/MVCAndroidArchitecture

An demo example of using MVC for Android Architecture.

Primary LanguageJava

MVC structure in Android Development

MainActivity:

public class ListActivity extends BaseActivity implements ListViewMvcImpl.Listener {
    private List<Data> mDataList = new ArrayList<>();
    private ListViewMvc mViewMvc;

    @Override
    protected void onStart() {
        super.onStart();
        getData();
    }

    private void getData() {
        bindData(mDataList);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFakeData();
        mViewMvc = new ListViewMvcImpl(LayoutInflater.from(this),null);
        mViewMvc.registerListener(this);
        setContentView(mViewMvc.getRootView());
    }

ViewMvc:

interface ListViewMvc extends ObservableViewMvc<ListViewMvc.Listener> {

    public interface Listener {
        void onDataClicked(Data data);
    }

    void bindDatas(List<Data> datas);

}

ViewMvcImp:

public class ListItemViewMvcImpl extends BaseObservableViewMvc<ListItemViewMvc.Listener>
        implements ListItemViewMvc {

    private final TextView mTxtTitle;
    private Data mData;

    public ListItemViewMvcImpl(LayoutInflater inflater, @Nullable ViewGroup parent) {
        setRootView(inflater.inflate(R.layout.layout_question_list_item, parent, false));
        mTxtTitle = findViewById(R.id.txt_title);
        getRootView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (Listener listener : getListeners()) {
                    listener.onDataClicked(mData);
                }
            }
        });
    }

    @Override
    public void bindData(Data data) {
        mData = data;
        mTxtTitle.setText(data.getTitle());
    }
}

BaseObservableViewMvc

public abstract class BaseObservableViewMvc<ListenerType> extends BaseViewMvc
        implements ObservableViewMvc<ListenerType> {

    private Set<ListenerType> mListeners = new HashSet<>();

    @Override
    public void registerListener(ListenerType listener) {
        mListeners.add(listener);
    }

    @Override
    public void unregisterListener(ListenerType listener) {
        mListeners.remove(listener);
    }

    protected Set<ListenerType> getListeners() {
        return Collections.unmodifiableSet(mListeners);
    }
}