নতুন রিসাইক্লারউউয়ের সাথে বিস্তৃত তালিকা আইটেমগুলি ব্যবহার করা সম্ভব? এক্সপেন্ডেবললিস্টভিউয়ের মতো?
নতুন রিসাইক্লারউউয়ের সাথে বিস্তৃত তালিকা আইটেমগুলি ব্যবহার করা সম্ভব? এক্সপেন্ডেবললিস্টভিউয়ের মতো?
উত্তর:
স্টক লেআউটম্যানেজারগুলির সাথে এটি করা সহজ, আপনি কীভাবে আপনার অ্যাডাপ্টার পরিচালনা করেন তার উপর নির্ভর করে এটি।
আপনি যখন কোনও বিভাগ প্রসারিত করতে চান যখন আপনি শিরোনামের পরে আপনার অ্যাডাপ্টারে নতুন আইটেম যুক্ত করুন। আপনি যখন এটি করবেন তখন notifyItemRangeInmitted কল করতে ভুলবেন না। কোনও বিভাগটি ভেঙে ফেলার জন্য আপনি কেবল প্রাসঙ্গিক আইটেমগুলি সরিয়ে ফেলুন এবং notifyItemRangeRemoved () এ কল করুন। যথাযথভাবে অবহিত যে কোনও ডেটা পরিবর্তনের জন্য, পুনর্ব্যবহারযোগ্য ভিউ দর্শনগুলিকে অ্যানিমেটেড করবে। আইটেমগুলি যুক্ত করার সময়, নতুন আইটেমগুলি ভরাট করার জন্য একটি অঞ্চল তৈরি করা হয়, নতুন আইটেমগুলি ম্লান হয়ে যায় Rem অপসারণ বিপরীত। অ্যাডাপ্টারের স্টাফের পাশাপাশি আপনাকে যা করতে হবে তা হ'ল ব্যবহারকারীকে যৌক্তিক কাঠামো জানানোর জন্য আপনার মতামতকে স্টাইল করা।
আপডেট: রায়ান ব্রুকস এখন এটি কীভাবে করবেন সে সম্পর্কে একটি নিবন্ধ লিখেছেন ।
থেকে নমুনা কোড বাস্তবায়ন করুন এখানে
ভিউহোল্ডারের অন ক্লিকের ভিতরে মান মানচিত্র নির্ধারণ করুন
@Override
public void onClick(final View view) {
if (mOriginalHeight == 0) {
mOriginalHeight = view.getHeight();
}
ValueAnimator valueAnimator;
if (!mIsViewExpanded) {
mIsViewExpanded = true;
valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5));
} else {
mIsViewExpanded = false;
valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight);
}
valueAnimator.setDuration(300);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
view.getLayoutParams().height = value.intValue();
view.requestLayout();
}
});
valueAnimator.start();
}
এখানে চূড়ান্ত কোড
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView mFriendName;
private int mOriginalHeight = 0;
private boolean mIsViewExpanded = false;
public ViewHolder(RelativeLayout v) {
super(v);
mFriendName = (TextView) v.findViewById(R.id.friendName);
v.setOnClickListener(this);
}
@Override
public void onClick(final View view) {
if (mOriginalHeight == 0) {
mOriginalHeight = view.getHeight();
}
ValueAnimator valueAnimator;
if (!mIsViewExpanded) {
mIsViewExpanded = true;
valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5));
} else {
mIsViewExpanded = false;
valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight);
}
valueAnimator.setDuration(300);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
view.getLayoutParams().height = value.intValue();
view.requestLayout();
}
});
valueAnimator.start();
}
}
ExpandableListView
" কাজ করে না , কারণ এ ক্ষেত্রে প্রসারিত সামগ্রীটি অ্যাডাপ্টারের থেকে আসা আইটেমগুলির সাথে একটি তালিকা। এটি একটি অধঃপতিত সমাধান যা কেবলমাত্র 1 টি আইটেমটিকে গ্রুপের অভ্যন্তরে শিশু হিসাবে অনুমোদিত।
https://github.com/gabrielemariotti/cardslib
এই লাইব্রেরিতে একটি পুনর্ব্যবহারযোগ্য ভিউ সহ একটি প্রসারিত তালিকার একটি বাস্তবায়ন রয়েছে ("কার্ডভিউভিনিটিভ" -> "তালিকা, গ্রিড এবং পুনর্ব্যবহারযোগ্য" -> "বিস্তৃত কার্ড") এর অধীনে ডেমো অ্যাপ্লিকেশনটি দেখুন। এটিতে কার্ড / তালিকার আরও অনেক দুর্দান্ত সংমিশ্রণ রয়েছে।
কেউ অভিযোগ করেছেন যে উপরে বর্ণিত সমাধানটি প্রসারণযোগ্য সামগ্রী হিসাবে তালিকার সাথে ব্যবহারযোগ্য নয়। তবে একটি সহজ সমাধান রয়েছে: একটি তালিকা ভিউ তৈরি করুন এবং এই তালিকাটি আপনার সারি দিয়ে ম্যানুয়ালি পূরণ করুন ।
অলসদের জন্য সমাধান: আপনি যদি নিজের কোডটি খুব বেশি পরিবর্তন করতে না চান তবে একটি সহজ সমাধান রয়েছে। দর্শন তৈরি করতে এবং এগুলিতে যুক্ত করতে কেবল নিজের অ্যাডাপ্টারটি ম্যানুয়ালি ব্যবহার করুনLinearLayout
।
উদাহরণটি এখানে:
if (mIsExpanded)
{
// llExpandable... is the expandable nested LinearLayout
llExpandable.removeAllViews();
final ArrayAdapter<?> adapter = ... // create your adapter as if you would use it for a ListView
for (int i = 0; i < adapter.getCount(); i++)
{
View item = adapter.getView(i, null, null);
// if you want the item to be selectable as if it would be in a default ListView, then you can add following code as well:
item.setBackgroundResource(Functions.getThemeReference(context, android.R.attr.selectableItemBackground));
item.setTag(i);
item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// item would be retrieved with:
// adapter.getItem((Integer)v.getTag())
}
});
llExpandable.addView(item);
}
ExpandUtils.expand(llExpandable, null, 500);
}
else
{
ExpandUtils.collapse(llExpandable, null, 500);
}
সহায়ক ফাংশন: getThemeReferences
public static int getThemeReference(Context context, int attribute)
{
TypedValue typeValue = new TypedValue();
context.getTheme().resolveAttribute(attribute, typeValue, false);
if (typeValue.type == TypedValue.TYPE_REFERENCE)
{
int ref = typeValue.data;
return ref;
}
else
{
return -1;
}
}
সহায়ক শ্রেণি: সম্প্রসারণ সামগ্রী
কাভিন ভারনান ইতিমধ্যে কীভাবে একটি বিন্যাসটি অ্যানিমেট করতে হবে তা পোস্ট করে ... তবে আপনি যদি আমার ক্লাসটি ব্যবহার করতে চান তবে নিঃসঙ্কোচে বলুন, আমি একটি টুকরো পোস্ট করেছি: https://gist.github.com/MichaelFlisar/738dfa03a1579cc7338a
recyclerview
এবং আপনি এই নেস্টেডটিকে প্রসারিত / লুকিয়ে রাখতে এবং সমস্ত অপ্টিমাইজেশন ব্যবহার করতে পারেনrecyclerview
আপনি প্রসারণযোগ্য লেআউটটি ব্যবহার করতে পারেন যা মসৃণ প্রসারিত / ধসের অ্যানিমেশন চেকবক্সের মতো হয়, তাই আপনি এটিকে তালিকাভিউ এবং রিসাইক্লারভিউতে চেকবক্স হিসাবে ব্যবহার করতে পারেন।
এটি আইটেম যুক্ত করতে এবং অপসারণ করতে এবং টনিক আর্টস দ্বারা টনিক আর্টস যা উল্লেখ করেছেন তার নমুনা কোডটি এটি পুনর্ব্যবহারযোগ্য অ্যানিমেশন এবং গিটহাব নমুনা থেকে নেওয়া হয়েছে
1) অনক্লিকের জন্য নিবন্ধন করতে আপনার onCreateViewHolder () এর মধ্যে শ্রোতা যুক্ত করুন
2) আপনার অ্যাডাপ্টারের অভ্যন্তরে আপনার কাস্টম অনক্লিকলিস্টনার তৈরি করুন
private View.OnClickListener mItemListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v.findViewById(R.id.tvItems);
String selected = tv.getText().toString();
boolean checked = itemsList.get(recyclerView.getChildAdapterPosition(v)).isChecked();
switch (selected){
case "Item1":
if(checked){
deleteItem(v);
itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(false);
}else {
addItem(v);
itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(true);
}
break;
case "Item2":
if(checked){
deleteItem(v);
itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(false);
}else {
addItem(v);
itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(true);
}
break;
default:
//In my case I have checkList in subItems,
//checkItem(v);
break;
}
}
};
3) আপনার অ্যাড আইটেম () এবং মুছুন আইটেম () যুক্ত করুন
private void addItem(View view){
int position = recyclerView.getChildLayoutPosition(view);
if (position != RecyclerView.NO_POSITION){
navDrawItems.add(position+1,new mObject());
navDrawItems.add(position+2,new mObject());
notifyItemRangeInserted(position+1,2);
}
}
private void deleteItem(View view) {
int position = recyclerView.getChildLayoutPosition(view);
if (position != RecyclerView.NO_POSITION) {
navDrawItems.remove(position+2);
navDrawItems.remove(position+1);
notifyItemRangeRemoved(position+1,2);
}
}
৪) যদি আপনার রিসাইক্লারভিউ অ্যাডাপ্টারটি পুনর্ব্যবহারযোগ্য ভিউয়ের মতো ক্রিয়াকলাপে না থাকে , তৈরি করার সময় পুনর্ব্যবহারযোগ্য দৃষ্টান্তটি অ্যাডাপ্টারে পাস করুন
৫) আইটেমলিস্ট হ'ল এমওজেক্ট টাইপের একটি অ্যারেলিস্ট যা আইটেমের স্টেটস (ওপেন / ক্লোজ), নাম, আইটেমের ধরণ (সাবআইটেম / মেইন আইটেম) বজায় রাখতে এবং থিমকে মানগুলির উপর ভিত্তি করে সেট করতে সহায়তা করে helps
public class mObject{
private String label;
private int type;
private boolean checked;
}