समस्या
आम तौर पर, आप 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 या इसके उप-वर्ग होगा। साथ ही, आपको आइटम दृश्य में अतिरिक्त टेक्स्ट दृश्य जोड़ने के लिए उचित लेआउट पैराम प्रदान करने की आवश्यकता है।
आप लेआउट में टेक्स्टव्यू जोड़ सकते हैं, और आपकी स्थिति के आधार पर इसे दृश्यमान/अदृश्य बना सकते हैं। – vishalk
मैं ऐसा नहीं करना चाहता ... क्योंकि इसमें अधिक विचार और निर्भरताएं हैं – user3607798