बस तीसरे पक्ष के पुस्तकालयों का उपयोग करने की कोई आवश्यकता नहीं है। इस विषय पर Google I / O 2016 में प्रदर्शित विधि और हाइजेनबर्ग में एक छोटा सा मोड़ , चाल करता है।
चूंकि notifyDataSetChanged() पूर्ण को फिरRecyclerView से परिभाषित करता है , notifyDataItemChanged()इसलिए एक बेहतर विकल्प है (सबसे अच्छा नहीं) क्योंकि हमारे पास स्थिति और ViewHolderहमारे निपटान में है, और notifyDataItemChanged()केवल किसी दिए गए स्थान पर विशेष ViewHolderको फिर से बनाता है ।
लेकिन समस्या यह है कि ViewHolderक्लिक करने पर समय से पहले गायब हो जाना और इसका उभरना भी समाप्त हो notifyDataItemChanged()जाता है, भले ही इसका उपयोग किया जाता हो।
निम्न कोड का समर्थन नहीं करता है notifyDataSetChanged()या notifyDataItemChanged()एपीआई 23 पर परीक्षण किया जाता है और एक पुनर्नवीनीकरण दृश्य पर उपयोग किए जाने पर एक आकर्षण की तरह काम करता है जहां प्रत्येक ViewHolder CardViewका मूल तत्व है:
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 से आरंभिक है।
detailsपूरा दृश्य जो विस्तारित और ढह जाने पर दिखाई देता है।
जैसा कि कहा गया है, का मूल तत्व ViewHolderएक CardViewहैforeground और stateListAnimatorइस विषय पर हाइजेनबर्ग द्वारा बिल्कुल के रूप में परिभाषित विशेषताओं कहा।
अद्यतन: उपरोक्त प्रदर्शन पूर्वविस्तृत विस्तारित वस्तु को ध्वस्त कर देगा यदि उनमें से एक का विस्तार हो। इस व्यवहार को संशोधित करने के लिए और एक विस्तारित आइटम रखने के लिए, क्योंकि यह तब भी है जब किसी अन्य आइटम का विस्तार किया जाता है, आपको निम्न कोड की आवश्यकता होगी।
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);
अद्यतन: सूची में अंतिम आइटम का विस्तार करते समय, इसे पूर्ण दृश्यता में नहीं लाया जा सकता है क्योंकि विस्तारित भाग स्क्रीन के नीचे चला जाता है। स्क्रीन के भीतर पूर्ण आइटम प्राप्त करने के लिए निम्न कोड का उपयोग करें।
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);
महत्वपूर्ण: काम करने के लिए उपर्युक्त प्रदर्शनों के लिए, किसी को अपने कोड में RecyclerView का एक उदाहरण रखना होगा और यह लेआउट प्रबंधक (लचीलेपन के लिए बाद में) है