我正在学习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();
}
}
仓库视图持有者
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));
}
}
RepositoryRowView
interface RepositoryRowView {
void setTitle(String title);
void setStarCount(int starCount);
}
我看到的所有指南都是关于在Adapter中创建onClickListener对象,然后在ViewHolder中使用它,但在这个实现中,我在我的Presenter中重写了所有的adapter函数,并且传递onClickListener(与Android相关的东西)会违反MVP模式。在这种情况下该怎么办?也许有人可以编写一个解决方案 - 真的很困惑。
我的主要目标是单击RecyclerView项并获取项名称(通过toast)。