Soluzione:
Il modo risolto questo problema è stato quello di realizzare un ascoltatore View.OnClickListener
alla ViewHolder
classe che extends RecyclerView.ViewHolder
. Così otteniamo il seguente codice:
public static class ExampleViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private int originalHeight = 0;
private boolean isViewExpanded = false;
private YourCustomView yourCustomView
// ..... CODE ..... //
}
Le variabili originalHeight
e isViewExpanded
vengono utilizzati nel processo di animazione. Nel costruttore ho inizializzare la vista del View.OnClickListener
in questo modo:
public ExampleViewHolder(View v) {
super(v);
v.setOnClickListener(this);
// Initialize other views, like TextView, ImageView, etc. here
// If isViewExpanded == false then set the visibility
// of whatever will be in the expanded to GONE
if (isViewExpanded == false) {
// Set Views to View.GONE and .setEnabled(false)
yourCustomView.setVisibility(View.GONE);
yourCustomView.setEnabled(false);
}
}
Ora che il costruttore si è preso cura di noi desidera configurare cosa succede quando l'utente fa clic su un individuo RecyclerView
elemento. Le classi che saranno utili in questo caso saranno gli oggetti ValueAnimator
e . Abbiamo l'override del metodo onClick
in questo modo per raggiungere questo obiettivo:.
@Override
public void onClick(final View view) {
// If the originalHeight is 0 then find the height of the View being used
// This would be the height of the cardview
if (originalHeight == 0) {
originalHeight = view.getHeight();
}
// Declare a ValueAnimator object
ValueAnimator valueAnimator;
if (!mIsViewExpanded) {
yourCustomView.setVisibility(View.VISIBLE);
yourCustomView.setEnabled(true);
mIsViewExpanded = true;
valueAnimator = ValueAnimator.ofInt(originalHeight, originalHeight + (int) (originalHeight * 2.0)); // These values in this method can be changed to expand however much you like
} else {
mIsViewExpanded = false;
valueAnimator = ValueAnimator.ofInt(originalHeight + (int) (originalHeight * 2.0), originalHeight);
Animation a = new AlphaAnimation(1.00f, 0.00f); // Fade out
a.setDuration(200);
// Set a listener to the animation and configure onAnimationEnd
a.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
yourCustomView.setVisibility(View.INVISIBLE);
yourCustomView.setEnabled(false);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
// Set the animation on the custom view
yourCustomView.startAnimation(a);
}
valueAnimator.setDuration(200);
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
view.getLayoutParams().height = value.intValue();
view.requestLayout();
}
});
valueAnimator.start();
}
Ora, quando si tocca un CardView individuale sul RecyclerView
(ammesso che abbiate una configurazione CardView
allora dovrebbe espandersi fare in modo di dichiarare il vostro CustomView correttamente nella vostra file xml (esempio se vuoi che lo CardView
si espanda verso il basso quando lo tocchi, quindi assegna correttamente la vista personalizzata sotto le altre viste e imposta la visibilità su andato quando lo dichiari e poi quando l'animazione inizia così nel codice sopra, quindi imposta il visibilità a Visibile e abilitazione della vista
Spero che questo possa aiutare qualcuno.
Hai visto [questa domanda] (http://stackoverflow.com/questions/26419161/expandable-list-with-recyclerview)? –
Penso che dovrai fare la ricerca da solo e postare una domanda specifica dopo. Per me questa è solo una domanda troppo grande e porta qualche ricerca in questo solo se dovesse sembrare come posso farlo funzionare. La mia opinione. Buon Natale a te comunque! ;) – Mike
Tanis grazie Non ho visto questa domanda, ma la mia linea di pensiero era corretta in quanto ViewHolder è molto più enfatizzato in RecyclerView - quindi quello che sto pensando è scrivere una vista personalizzata per contenere il layout espanso e associare un onItemClickListener o onItemTouchListener alla voce di elenco. – AndyRoid