बस तीसरे पक्ष के पुस्तकालयों का उपयोग करने की कोई आवश्यकता नहीं है। इस विषय पर 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 का एक उदाहरण रखना होगा और यह लेआउट प्रबंधक (लचीलेपन के लिए बाद में) है