তৃতীয় পক্ষের গ্রন্থাগারগুলি ব্যবহার করার দরকার নেই। এই বিষয়টিতে গুগল আই / ও ২০১ He এবং হাইজেনবার্গে প্রদর্শিত পদ্ধতিটিতে সামান্য টুইট করা কৌশলটি কার্যকর করে the
যেহেতু notifyDataSetChanged() সম্পূর্ণরূপে redrawsRecyclerView , notifyDataItemChanged()একটি ভাল বিকল্প (সেরা নয়) কারণ আমাদের অবস্থান এবং ViewHolderআমাদের নিষ্পত্তিস্থল রয়েছে এবং নির্দিষ্টটি একটি নির্দিষ্ট অবস্থানেnotifyDataItemChanged() কেবল নির্দিষ্ট ViewHolderকরে তোলে ।
তবে সমস্যাটি হ'ল উপরের ViewHolderক্লিকের অকাল অদৃশ্যতা এবং এর উত্থানটি notifyDataItemChanged()ব্যবহার করা হলেও মুছে ফেলা হয় না ।
নিম্নলিখিত কোড নেই অবলম্বন notifyDataSetChanged()বা notifyDataItemChanged()এবং কখন RecyclerView যেখানে প্রতিটি ViewHolder টি ব্যবহার এপিআই 23 এবং একটি যাদুমন্ত্র মত কাজ করে পরীক্ষা করা হয় 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 এই বিষয়ে হাইজেনবের্গ দ্বারা ঠিক হিসাবে সংজ্ঞায়িত বৈশিষ্ট্যাবলী বলেন।
আপডেট: উপরোক্ত প্রদর্শনগুলি প্রিজিওসোলি বিস্তৃত আইটেমগুলির মধ্যে একটির প্রসারিত হলে ভেঙে পড়বে। এই আচরণটি পরিবর্তন করতে এবং প্রসারিত আইটেমটিকে অন্য আইটেমটি প্রসারিত করার পরেও তা রাখতে, আপনার নিম্নলিখিত কোডের প্রয়োজন the
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);
গুরুত্বপূর্ণ: উপরোক্ত বিক্ষোভগুলি কাজ করার জন্য, তাদের কোডগুলিতে অবশ্যই পুনর্ব্যবহারযোগ্য ভিউ এবং এটির লেআউটম্যানেজারের একটি উদাহরণ রাখতে হবে (পরে নমনীয়তার জন্য)