नए RecyclerView के साथ विस्तार योग्य सूची आइटम का उपयोग करना संभव है? एक्सपेंडेबल लाइस्ट व्यू की तरह?
नए RecyclerView के साथ विस्तार योग्य सूची आइटम का उपयोग करना संभव है? एक्सपेंडेबल लाइस्ट व्यू की तरह?
जवाबों:
यह स्टॉक लेआउट मैनेजर के साथ करना आसान है, यह सब इस बात पर निर्भर करता है कि आप अपने एडेप्टर का प्रबंधन कैसे करते हैं।
जब आप किसी अनुभाग का विस्तार करना चाहते हैं तो आप हेडर के बाद अपने एडेप्टर में नए आइटम जोड़ते हैं। जब आप ऐसा करते हैं तो InformItemRangeInserted पर कॉल करना याद रखें। किसी अनुभाग को संक्षिप्त करने के लिए आप संबंधित आइटम हटा दें, और InformItemRangeRemoved () को कॉल करें। उचित रूप से अधिसूचित किए गए किसी भी डेटा परिवर्तन के लिए, रिसाइकलर दृश्य को चेतन करेगा। वस्तुओं को जोड़ते समय, नई वस्तुओं से भरा जाने वाला क्षेत्र बनाया जाता है, जिसमें नई वस्तुएं लुप्त होती हैं। निष्कासन विपरीत होता है। एडेप्टर सामान के अलावा आपको बस इतना करना है कि उपयोगकर्ता को तार्किक संरचना को व्यक्त करने के लिए अपने विचारों को शैली दें।
अपडेट: रयान ब्रूक्स ने अब यह कैसे करना है पर एक लेख लिखा है ।
यहां से नमूना कोड कार्यान्वयन प्राप्त करें
ViewHolder के onClick के अंदर ValueAnimator सेट करें
@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
इस लाइब्रेरी में एक recyclerview के साथ एक विस्तार योग्य सूची का कार्यान्वयन है ("CardViewNative" के तहत डेमो ऐप का संदर्भ लें -> "सूची, ग्रिड और RecyclerView" -> "विस्तार योग्य कार्ड")। इसमें कार्डों / सूचियों के कई अन्य अच्छे संयोजन भी हैं।
किसी ने शिकायत की कि उपर्युक्त समाधान विस्तार योग्य सामग्री के रूप में सूची के साथ प्रयोग करने योग्य नहीं है। लेकिन एक सरल समाधान है: एक सूची बनाएं और इस सूची को मैन्युअल रूप से अपनी पंक्तियों के साथ भरें ।
आलसी लोगों के लिए समाधान: यदि आप अपना कोड बहुत अधिक नहीं बदलना चाहते हैं तो एक सरल उपाय है। बस अपने एडेप्टर का उपयोग विचारों को बनाने और उन्हें जोड़ने के लिए करें 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);
}
सहायक कार्य: getThemeReference
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;
}
}
सहायक वर्ग: विस्तारक
Kavin Varnan पहले से ही एक लेआउट को एनिमेट करने का तरीका ... लेकिन अगर आप मेरी कक्षा का उपयोग करना चाहते हैं, तो बेझिझक ऐसा करें, मैंने एक जिस्ट पोस्ट किया: https://gist.github.com/MichaelFlisar/738dfa0a1579cc7338a
recyclerview
और आप इस नेस्टेड एक का विस्तार / छिपा सकते हैं औरrecyclerview
आप एक्सपेंडेबल लाइट का उपयोग कर सकते हैं जो कि एक स्मूथ एक्सपेंडेबल / पतन एनीमेशन चेकबॉक्स की तरह है, इसलिए आप इसे लिस्टबॉक्स और रिसायकलर व्यू में चेकबॉक्स के रूप में उपयोग कर सकते हैं।
यह आइटमों को जोड़ने और हटाने के लिए @TonicArtos द्वारा बताए गए और इसे करते समय चेतन करने के लिए नमूना कोड है , यह RecyclerView एनिमेशन और GitHub नमूना से लिया गया है
1) अपने onCreateViewHolder के अंदर श्रोता जोड़ें () onClick के लिए रजिस्टर करने के लिए
2) अपने एडाप्टर के अंदर अपने कस्टम OnClickListener बनाएँ
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) अपना AddItem () और DeleteItem () जोड़ें
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);
}
}
4) यदि आपका RecyclerViewAdapter पुनर्नवीनीकरण दृश्य के समान गतिविधि में नहीं है , तो बनाने के दौरान एडाप्टर को recyclerView का उदाहरण दें
5) आइटम लिस्ट एक प्रकार का mObject का ArrayList है जो आइटम की स्थिति (ओपन / क्लोज), नाम, आइटम का प्रकार (सबटाइम्स / mainItem) बनाए रखने में मदद करता है और मूल्यों पर आधारित थीम सेट करता है
public class mObject{
private String label;
private int type;
private boolean checked;
}