Üçü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 ViewHolder
bizim emrinde ve notifyDataItemChanged()
sadece belirli yeniden çizer ViewHolder
belirli bir pozisyonda .
Ancak sorun, ViewHolder
tı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 ViewHolder
bir olduğunu CardView
ile foreground
ve stateListAnimator
bu 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.