2015-09-01 12 views
12

के आइटम के लिए गतिशील रूप से एक दृश्य जोड़े मैं RecyclerView.Adapter के आइटम ModalObject के आधार पर करने के लिए अतिरिक्त TextView जोड़ना चाहते हैं RecyclerView.AdapterRecyclerView

उदाहरण के लिए भेजा:

मैं एक मॉडल था isAddText चर के साथ वस्तु। onCreateViewHolder में पैरामीटर के रूप में itemView भेजने के साथ होल्डर ऑब्जेक्ट बनाएगा।

@Override 
public SolventViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.solvent_list, null); 
    SolventViewHolders rcv = new SolventViewHolders(layoutView); 
    return rcv; 
} 

SolventViewHolders.java

public SolventViewHolders(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 
    textView = (TextView) itemView.findViewById(R.id.country_name); 
    imageView = (ImageView) itemView.findViewById(R.id.country_photo); 
    // Now i need add a view to the itemView parent based on ModalObject isAddView property and how to do that. 
} 
+0

आप लेआउट में टेक्स्टव्यू जोड़ सकते हैं, और आपकी स्थिति के आधार पर इसे दृश्यमान/अदृश्य बना सकते हैं। – vishalk

+0

मैं ऐसा नहीं करना चाहता ... क्योंकि इसमें अधिक विचार और निर्भरताएं हैं – user3607798

उत्तर

16

समस्या

आम तौर पर, आप itemView.addView (देखने के लिए, layoutParams) निष्पादित करने के लिए अपने लेआउट में प्रोग्राम के एक और दृश्य जोड़ने की जरूरत है, लेकिन बात के साथ ViewHolders है, उन्हें एडाप्टर से अलग-अलग आइटमों को बाध्य करने के लिए रीसाइक्लर व्यू द्वारा पुन: उपयोग किया जाएगा, ताकि आप ऐसा नहीं कर सकें या यह नया टेक्स्ट व्यू जो आप जोड़ना चाहते हैं, तब दिखाई देगा जब कोई अन्य आइटम इस दृश्य से जुड़ा होगा होल्डर इंस्टेंस फिर से।

मैं कुछ तरीके के बारे में सोच सकते हैं आप अपने लक्ष्य को प्राप्त कर सकते हैं:


1. स्विच देखें की दृश्यता

पहला तरीका अपने लेआउट को यह TextView जोड़ सकते हैं और से उसकी दृश्यता है डिफ़ॉल्ट रूप से चला गया, और दृश्य के लिए सेट है, जब बंधन जैसे कि एक आइटम आप के लिए यह TextView की जरूरत है:

@Override 
public void onBindViewHolder(AbstractViewHolder holder, int position) { 
    holder.extraTextView.setVisibility(View.GONE); 
    if(shouldShowExtraTextView) { 
     holder.extraTextView.setVisibility(View.VISIBLE); 
     holder.extraTextView.setText(/* your text */); 
    } 
    // proceed to bind item to holder 
} 

2. विभिन्न व्यूहोल्डर लागू करें

दूसरा तरीका अधिक सुरुचिपूर्ण है, इसमें विभिन्न व्यूहोल्डर प्रकार बनाना शामिल है। सबसे पहले आपको RecyclerView द्वारा दिखाए जाने वाले दो प्रकार के दृश्यों के लिए int स्थिरांक बनाने की आवश्यकता है। अपने एडाप्टर में रखें निम्न कोड:

:

@Override 
public int getItemViewType(int position) { 
    if(position == /* position of item that needs extra text view */) { 
     return VIEW_WITH_EXTRA_TEXT_VIEW; 
    } else { 
     return VIEW_ORDINARY; 
    } 
} 

अगला चरण लौटे आधार पर भिन्न हो धारक बनाने के लिए है:

private static final int VIEW_ORDINARY = 0; 
private static final int VIEW_WITH_EXTRA_TEXT_VIEW = 1; 

फिर getItemViewType (पूर्णांक स्थिति) एडाप्टर की विधि को लागू

:
@Override 
public SolventViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if(viewType == VIEW_WITH_EXTRA_TEXT_VIEW) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
             .inflate(R.layout.solvent_list_with_extra_text_view, parent, false); 
     return new SolventViewHolderWithExtraTextView(itemView); 
    } else { 
     View itemView = LayoutInflater.from(parent.getContext()) 
             .inflate(R.layout.solvent_list, parent, false); 
     return new SolventViewHolder(itemView); 
    } 
} 
बेशक

आप SolventViewHolderWithExtraTextView परिभाषित करने की जरूरत

और फिर onBindViewHolder में():

@Override 
public void onBindViewHolder(SolventViewHolder holder, int position) { 
    // you can use inheritance to handle binding logic or check the item view type again: 
    // bind ordinary view 
    if(getItemViewType(position)) { 
     // bind the extra textView 
     ((SolventViewHolderWithExtraTextView)holder).extraTextView.setText("I hope this works"); 
    } 
} 

इस तरह आप अपने आइटम एक और TextView जरूरत है कि के लिए ViewHolder का एक और प्रकार है, और इसे उस श्रेणी में दोबारा इस्तेमाल किया जाएगा। आप जो करना चाहते हैं उसे करने का यह एक पसंदीदा तरीका है।


3।जोड़ें/निकालें देखें गतिशील

एक और जवाब (जो वास्तव में बदसूरत समाधान है अगर आप मुझसे पूछें) जैसे जोड़ सकते हैं और गतिशील रूप से दृश्य को हटाने के लिए, यह है:

@Override 
public void onBindViewHolder(AbstractViewHolder holder, int position) { 
    if(shouldDisplayExtraTextView) { 
     if(!holder.displaysExtraTextView() { 
      holder.addExtraTextView(); 
     } 
     holder.extraTextView.setText("This solution is really ugly"); 
     } else { 
     if(holder.displaysExtraTextView() { 
      holder.removeExtraTextView(); 
     } 
    } 
} 

class SolventViewHolders extends RecyclerView.ViewHolder { 
    TextView extraTextView; 
    boolean viewAdded = false; 

    public SolventViewHolders(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(this); 
     textView = (TextView) itemView.findViewById(R.id.country_name); 
     imageView = (ImageView) itemView.findViewById(R.id.country_photo); 
     // Now i need add a view to the itemView parent based on ModalObject isAddView property and how to do that. 

     extraTextView = new TextView(); 
} 

public void addExtraTextView() { 
    ((ViewGroup)itemView).addView(extraTextView, layoutParams); 
    viewAdded = true; 
} 

public void removeExtraTextView() { 
    ((ViewGroup)itemView).removeView(extraTextView); 
    viewAdded = false; 
} 

public boolean displaysExtraTextView() { 
    return viewAdded; 
} 

क्योंकि करने के लिए दृश्य जोड़ने के लिए यह वास्तव में बदसूरत है itemView आपको इसे ViewGroup (जिसे यह होना आवश्यक नहीं है) में डालने की आवश्यकता है, इसलिए सुनिश्चित करें कि यह हमेशा एक ViewGroup या इसके उप-वर्ग होगा। साथ ही, आपको आइटम दृश्य में अतिरिक्त टेक्स्ट दृश्य जोड़ने के लिए उचित लेआउट पैराम प्रदान करने की आवश्यकता है।

+0

मैं लेआउट को फुला नहीं चाहता हूं, मेरे लिए विचारों को गतिशील रूप से जोड़ने का एकमात्र तरीका है। – user3607798

+0

मैंने अपना जवाब संपादित करने के लिए एक और तरीका शामिल किया है जिसे आप चाहते हैं, हालांकि यह वास्तव में एक सुरुचिपूर्ण समाधान नहीं है, लेकिन अगर किसी कारण से, जैसा कि आप कहते हैं, तो आप एक और लेआउट नहीं बढ़ा सकते हैं, यह चाल चलनी चाहिए। – maciekjanusz

+0

@invariant क्या होगा यदि एक लेआउट (व्यू) में एक बटन है और अन्य यह नहीं मानते कि बटन ऑनक्लिक ईवेंट लागू है? – Journey

0

आप itemView.setHasTransientState(true) भी सेट कर सकते हैं, जिस स्थिति में दृश्य setHasTransientStatefalse पर रीसाइक्लिंग नहीं किया जाएगा।