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)
| 归档时间: |
|
| 查看次数: |
2908 次 |
| 最近记录: |