0

J'ai trois classes à savoir. un fragment, un recyclerViewAdapter et un recyclerViewHolder. Ils travaillent de la manière habituelle. Mais maintenant j'ai un problème, j'ai besoin d'appeler une méthode dans le ViewHolder de ladite activité.Comment appeler la méthode ViewHolder à partir de l'activité/Fragment

Je pensais utiliser des rappels, mais j'ai essayé et ça ne fonctionne pas. Voilà ce que je l'ai fait jusqu'à présent:

L'interface

public interface TreeBottomListener { 
    enum Status {FAILED, SUCCESS, PRE_REQUEST} 
    void onResponse(Status status); 
} 

Le ViewHolder

public class TreeBottomViewHolder extends RecyclerView.ViewHolder implements TreeBottomListener{ 
    @BindView(R.id.tree_bottom_progress) ProgressBar bottomProgress; 
    @BindView(R.id.tree_error_button) Button moreRetryButton; 
    private TreeAdapterListener listener; 
    private final String TAG = "TreeBottomViewHolder"; 

    public TreeBottomViewHolder(View itemView, final TreeAdapterListener listener) { 
     super(itemView); 
     ButterKnife.bind(this, itemView); 
     this.listener = listener; 
     setUpViews(); 
    } 

    private void setUpViews() { 
     bottomProgress.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor 
       (itemView.getContext(), R.color.colorAccent), PorterDuff.Mode.SRC_IN); 

     moreRetryButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       v.setVisibility(View.GONE); 
       listener.onLoadMoreClicked(); 
      } 
     }); 
    } 

    @Override 
    public void onResponse(Status status) { 
     processViews(status); 
    } 

    private void processViews(Status status) { 
    // This method is never called 
     Log.i(TAG, "onResponse: with status " + status); 
     if (status == Status.FAILED) { 
      bottomProgress.setVisibility(View.GONE); 
      moreRetryButton.setVisibility(View.VISIBLE); 

     } else if (status == Status.SUCCESS) { 
      bottomProgress.setVisibility(View.GONE); 

     } else if (status == Status.PRE_REQUEST) { 
      bottomProgress.setVisibility(View.VISIBLE); 
     } 
    } 
} 

Le fragment

private TreeBottomListener bottomListener = bottomCallbacks; 

private static TreeBottomListener bottomCallbacks = new TreeBottomListener() { 
     @Override 
     public void onResponse(Status status) { 

     } 
    }; 

// I do this say when a network request is about to be sent 
bottomListener.onResponse(TreeBottomListener.Status.PRE_REQUEST); 
+0

Voir [link] (http://stackoverflow.com/questions/32720702/how-to-call-a-mainactivity-method-from-viewholder-in-recyclerview-adapter) pour votre référence –

+0

@vijaychhalotre, Merci. Je l'ai déjà vu, mais je veux faire est la méthode inverse d'appel ViewHolder de Fragment/Activity. – X09

+0

Vous ne devriez pas faire cela. Cela rendra votre code étroitement couplé et très complexe. La tâche de l'adaptateur doit être d'afficher les éléments dans la liste ou recyclerView. L'activité ne doit pas interagir directement avec l'adaptateur ou ViewHolder. Si vous souhaitez actualiser les éléments de la liste, modifiez la liste des données de l'adaptateur et appelez la méthode notifydatasetChange. – nnn

Répondre

2

vous pouvez appeler cette méthode (YourAdapter.TreeBottomViewHolder)recyclerView.findViewHolderForLayoutPosition(position); retourne ViewHolder, vous pouvez vérifier à propos de la position de l'article en utilisant le code suivant:

private boolean isCurrentListViewItemVisible(int position) { 
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
    int first = layoutManager.findFirstVisibleItemPosition(); 
    int last = layoutManager.findLastVisibleItemPosition(); 
    return first <= position && position <= last; 
} 

alors vous pouvez faire ce qui suit:

TreeBottomViewHolder holder = (YourAdapter.TreeBottomViewHolder)recyclerView.findViewHolderForLayoutPosition(position); 

if(isCurrentListViewItemVisible(position)){ 
    // you can access your views here 
} 

je souhaite si t'aide.

+0

Pour une raison inconnue, il retourne null. – X09