使用MVP模式实现onItemClickListener

Jos*_*Mad 9 mvp android onclicklistener

我正在学习MVP并且混淆我应该在哪里以及如何实现onClickListener而不破坏mvp概念.

按照本指南: https://android.jlelse.eu/recyclerview-in-mvp-passive-views-approach-8dd74633158

我的实施.

适配器:

public class RepositoriesRecyclerAdapter extends RecyclerView.Adapter<RepositoriesRecyclerAdapter.RepoViewHolder> {


private final RepositoriesListPresenter presenter;

public RepositoriesRecyclerAdapter(RepositoriesListPresenter repositoriesPresenter) {
    this.presenter = repositoriesPresenter;
}

@Override
public RepositoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new RepositoryViewHolder(LayoutInflater.from(parent.getContext())
                                            .inflate(R.layout.cell_repo_view, parent, false));
}

@Override
public void onBindViewHolder(RepositoryViewHolder holder, int position) {
    presenter.onBindRepositoryRowViewAtPosition(position, holder);

}

@Override
public int getItemCount() {
    return presenter.getRepositoriesRowsCount();
}

}
Run Code Online (Sandbox Code Playgroud)

RepositoryViewHolder的

public class RepositoryViewHolder extends RecyclerView.ViewHolder implements RepositoryRowView {

    TextView titleTextView;
    TextView starsCountTextView;

    public RepositoryViewHolder(View itemView) {
        super(itemView);
        titleTextView = itemView.findViewById(R.id.repoTitleText);
        starsCountTextView = itemView.findViewById(R.id.repoStarsCountText);
    }

    @Override
    public void setTitle(String title) {
        titleTextView.setText(title);
    }

    @Override
    public void setStarCount(int starCount) {
        starsCountTextView.setText(String.format("%s ?", starCount));
    }
}
Run Code Online (Sandbox Code Playgroud)

RepositoryRowView

interface RepositoryRowView {

    void setTitle(String title);

    void setStarCount(int starCount);
}
Run Code Online (Sandbox Code Playgroud)

我看到的所有指南都是关于在Adapter中创建onClickListener对象然后在ViewHolder中使用它,但是在这个实现中,我覆盖了我的演示者中的所有适配器函数,并且传递onClickListener(与android相关的东西)会与mvp模式相矛盾.在这种情况下该怎么做.也许有人可以写一个解决方案 - 真的很困惑.

我的主要目标是点击recyclerview项目并获取项目名称(通过吐司)

Jos*_*cik 12

OnClickListener是Android SDK的界面.您的演示者不应该对Andriod SDK有任何了解.它应该是纯Java,因此只需在JVM上使用单元测试即可对其进行测试.它不应该对视图,RecyclerView,Adapter和ViewHolder有所了解.

你的onBindViewHolder没有违反这个原则,因为它被一个抽象的接口--RepositoryRowView分开.

您应该在适配器/视图中实现OnClickListener并从那里调用您的演示者.

public class RepositoryViewHolder extends RecyclerView.ViewHolder implements RepositoryRowView, View.OnClickListener {

    TextView titleTextView;
    TextView starsCountTextView;
    RepositoriesListPresenter presenter;

    public RepositoryViewHolder(View itemView, RepositoriesListPresenter presetner) {
        super(itemView);
        titleTextView = itemView.findViewById(R.id.repoTitleText);
        starsCountTextView = itemView.findViewById(R.id.repoStarsCountText);
        this.presenter = presenter;
        itemView.setOnClickListener(this);
    }

    @Override
    public void setTitle(String title) {
        titleTextView.setText(title);
    }

    @Override
    public void setStarCount(int starCount) {
        starsCountTextView.setText(String.format("%s ?", starCount));
    }

    @Override
    public void onClick(View view) {
        if (presenter != null) {
            presenter.onItemInteraction(getAdapterPosition());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)