2017-08-31 13 views
5

を使用してonItemClickListener実装私はMVPを勉強し、ここでMVPコンセプトを台無しにされていないがどこは私がonClickListener実装すべきか混乱してしまいました。 https://android.jlelse.eu/recyclerview-in-mvp-passive-views-approach-8dd74633158はMVPパターン

私の実装:

は、このガイドに従いました。

アダプタ:

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(); 
} 

} 

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)); 
    } 
} 

RepositoryRowView

interface RepositoryRowView { 

    void setTitle(String title); 

    void setStarCount(int starCount); 
} 

私はアダプタでonClickListenerオブジェクトを作成し、ViewHolderでそれを使用についてだった見ましたが、これですべてのガイド実装、私は私の発表者のすべてのアダプタ機能をオーバーライドするonClickListener(android related stuff)を渡すと、mvpパターンと矛盾します。この場合に何をするか。たぶん、誰かが解決策を書くことができました - 本当に混乱しました。

私の主な目標は、OnClickListenerは、Android SDKからインタフェースである

答えて

4

(トーストを経由して)recyclerview項目をクリックして、項目名を取得することです。あなたのプレゼンターは、Andriod SDKについて何も知らないでください。純粋なJavaでなければならないので、JVMで単体テストを使用するだけでテストできます。ビュー、RecyclerView、Adapter、ViewHolderについては何も知ってはいけません。

あなたのonBindViewHolderは、抽象的なインタフェースRepositoryRowViewによって分離されているため、この原則に違反しません。

Adapter/viewholderに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()); 
     } 
    } 
} 
+0

たとえば、選択したアイテムの色を変更したい場合はどうすればいいですか? アイテムをプレゼンターに渡すことはできません(前にも触れましたが)私はそのポジションを渡すことができました。 – JoshuaMad

+1

@JoshuaMad既に用意されている抽象化を使用することができます。位置とRepositoryRowViewを渡すことができます(これはViewHolderによって実装されているため、パラメータとして「this」を単に追加することができます)。 RepositoryRowViewクラスにメソッドを追加するよりも簡単です。何か "markRowAs ..."とその実装は色の変更を行います。 –

0

これは興味深いことです。私はをキャッチアイテムをクリックして外観を変更する必要がある同様の状況があります。 @JosefAdamcik abstration(ViewholderPresenter)からのクリックを管理する方法の良い例を示しましたが、クリックがAdapterに設定されていればどうなるでしょうか?私はAdapter(クリックしたアイテムの位置を渡します)からPresenterを通知できますが、上記の抽象化は使用できません。

+0

質問を回答として投稿しないようにしてください。代わりにあなたの質問を質問として投稿してください。 – WebDevBooster

関連する問題