Üçüncü taraf kitaplıklarını kullanmaya gerek yoktur. Bir küçük çimdik gösterilmiştir yöntemde Google I / O 2016 Bu konuyla ilgili ve Heisenberg, hile yok.
Yana notifyDataSetChanged() tam yeniden çizimlerinRecyclerView , notifyDataItemChanged()biz konumunu ve var çünkü daha iyi bir seçenek (iyi) olan ViewHolderbizim emrinde ve notifyDataItemChanged()sadece belirli yeniden çizer ViewHolderbelirli bir pozisyonda .
Ancak sorun, ViewHoldertıklamanın erken kaybolması ve ortaya çıkmasının bile ortadan kalkmamasıdır.notifyDataItemChanged() kullanılsa .
Aşağıdaki kod gelmez başvurmak notifyDataSetChanged()veya notifyDataItemChanged()her ViewHolder bir olan bir RecyclerView kullanıldığında API 23 ve bir cazibe gibi eserler üzerinde test edilir CardView's kök eleman olarak:
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final boolean visibility = holder.details.getVisibility()==View.VISIBLE;
if (!visibility)
{
holder.itemView.setActivated(true);
holder.details.setVisibility(View.VISIBLE);
if (prev_expanded!=-1 && prev_expanded!=position)
{
recycler.findViewHolderForLayoutPosition(prev_expanded).itemView.setActivated(false);
recycler.findViewHolderForLayoutPosition(prev_expanded).itemView.findViewById(R.id.cpl_details).setVisibility(View.GONE);
}
prev_expanded = position;
}
else
{
holder.itemView.setActivated(false);
holder.details.setVisibility(View.GONE);
}
TransitionManager.beginDelayedTransition(recycler);
}
});
prev_position -1 olarak başlatılmış bir global tamsayıdır.
details, genişletildiğinde gösterilen ve daraltıldığında gizlenen tam görünümdür.
As kök öğesi, söz konusu ViewHolderbir olduğunu CardViewile foregroundve stateListAnimatorbu konuda Heisenberg tarafından tam olarak tanımlanır söyledi bağlıyor.
GÜNCELLEME: Yukarıdaki gösteri, biri genişletilmişse, daha önce genişletilmiş öğeyi daraltır. Bu davranışı değiştirmek ve genişletilmiş bir öğeyi başka bir öğe genişletilse bile olduğu gibi tutmak için aşağıdaki koda ihtiyacınız olacaktır.
if (row.details.getVisibility()!=View.VISIBLE)
{
row.details.setVisibility(View.VISIBLE);
row.root.setActivated(true);
row.details.animate().alpha(1).setStartDelay(500);
}
else
{
row.root.setActivated(false);
row.details.setVisibility(View.GONE);
row.details.setAlpha(0);
}
TransitionManager.beginDelayedTransition(recycler);
GÜNCELLEME: Listedeki son öğeleri genişletirken, genişletilmiş bölüm ekranın altına ineceğinden tam görünüme getirilemeyebilir. Ekrandaki tüm öğeyi almak için aşağıdaki kodu kullanın.
LinearLayoutManager manager = (LinearLayoutManager) recycler.getLayoutManager();
int distance;
View first = recycler.getChildAt(0);
int height = first.getHeight();
int current = recycler.getChildAdapterPosition(first);
int p = Math.abs(position - current);
if (p > 5) distance = (p - (p - 5)) * height;
else distance = p * height;
manager.scrollToPositionWithOffset(position, distance);
ÖNEMLİ: Yukarıdaki gösterilerin çalışması için, kodlarında RecyclerView ve LayoutManager'ın (daha sonra esneklik için daha sonra) bir örneği tutulmalıdır.