दिलचस्प पोस्ट
'स्थिर' साझा करने के लिए जावा में स्थिर क्षेत्रों के साथ इंटरफेस चेतावनी: प्रारूप स्ट्रिंग नहीं है और कोई प्रारूप तर्क नहीं जावास्क्रिप्ट स्तरीयजर के दौरान ASP.NET MVC में MaxJsonLength अपवाद चयन (ड्रॉपडाउन) के लिए पृष्ठभूमि छवि क्रोम में काम नहीं करती jQuery AJAX क्वेरी से मेरे JSON को पार्स नहीं करेगा कैसे दो तालिकाओं mysql में शामिल होने के लिए? एक स्ट्रेट में अनसाइज्ड सरणी घोषणा Node.JS लिनक्स कमांड लाइन का उपयोग कर अनइंस्टाल करें? पायथन आयात कोडिंग शैली क्या एक 'स्थिति: निश्चित' (हमेशा शीर्ष पर) div करने के लिए सरल jQuery तरीका क्या है? WinForm अनुप्रयोग UI लांग-रनिंग ऑपरेशन के दौरान लटका हुआ है चहचहाना बूटस्ट्रैप ड्रॉपडाउन टॉगल लिंक पर क्लिक करने की अनुमति दें? Google Play सेवाओं पर अपग्रेड करें: 9.0.0 त्रुटि को हल करने में विफल: com.google.android.gms: play-services-measurement: 9.0.0 मुझे फ्लोटिंग प्वाइंट तुलना कैसे करनी चाहिए? Android SQLite उदाहरण

सूची दृश्य के माध्यम से डायनामिक रूप से जेनरेट किए गए चेकबॉक्स को चेक करते समय कोई समस्या हो रही है

मुझे पता है कि यह सवाल पहले से ही अन्य सदस्यों द्वारा पूछा जाता है और समाधान कुछ सदस्यों द्वारा भी दिया जाता है लेकिन यह बात यह है कि मैंने अपने एप के लिए उपयुक्त कोई भी समाधान नहीं पाया। मैं एक ऐसे ऐप का निर्माण कर रहा हूँ जिसमें मेरे पास एक स्क्रीन है जिसमें सूची आइटम एक चेकबॉक्स और तीन पाठ दृश्य (एक उम्मीदवार के नाम के लिए है और अन्य दो घड़ी में और घड़ी के लिए हैं घड़ी के साथ गतिशील सूचीदृश्य प्रदर्शित करेगा जो दिनांक और समय को चुनने के बाद प्रदर्शित करेगा दिनांक समय पिकर) .मैं मेरी समस्या यह है कि जब मैं पहले चेकबॉक्स (चेकबॉक्स के साथ 15 उम्मीदवार का नाम होता है) को चेक करता हूं तो स्वचालित रूप से 10 वां चेकबॉक्स चेक होता है और यह दूसरी और 11 वें, 3 व 12 वें और इसके साथ भी होता है (उपकथा भी सच है) .मैं अपने एडेप्टर वर्ग और सूची आइटम xml प्रदान कर रहा हूँ।

import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.Toast; import com.android.feedback.ListViewCheckBox; public class DemoAdapter extends ArrayAdapter<String>{ private final List<String> list; private final Activity context; LayoutInflater inflater; TextView CItv,COtv; static ViewHolder holder; View view; public DemoAdapter(Activity context, List<String> list) { super(context, R.layout.test_listitems,list); // TODO Auto-generated constructor stub this.context = context; this.list = list; } static class ViewHolder { protected TextView text,CItv,COtv; protected CheckBox checkbox; } @Override public View getView(final int position, View convertView, ViewGroup parent) { view = null; // final ArrayList<Integer> checkedItems = new ArrayList<Integer>(); if (convertView == null) { inflater = context.getLayoutInflater(); view = inflater.inflate(R.layout.test_listitems, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.CItv = (TextView)view.findViewById(R.id.CITextView); viewHolder.COtv = (TextView)view.findViewById(R.id.COTextView); viewHolder.text = (TextView) view.findViewById(R.id.empTextView); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.empCheckBox); viewHolder.checkbox .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ Object o = getItemId(position+1); String keyword = o.toString(); Toast.makeText(getContext(), "You selected: " + keyword, 2000).show(); Toast.makeText(getContext(),ListViewCheckBox.DT_selected, 2000).show(); // holder.CItv.setText(ListViewCheckBox.DT_selected); // holder.COtv.setText(ListViewCheckBox.outDT_selected); } else{ Object o = getItemId(position+1); String keyword = o.toString(); //Toast.makeText(getContext(), "You unselected: " + keyword, 2000).show(); holder.CItv.refreshDrawableState(); holder.COtv.refreshDrawableState(); } } }); view.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); viewHolder.checkbox.setId(position); } else { view = convertView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } holder = (ViewHolder) view.getTag(); holder.text.setText(list.get(position)); return view; } } 

और एक्सएमएल

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:stretchColumns="1,2,3"> <TableRow > <CheckBox android:text=" " android:id="@+id/empCheckBox" style="@style/Check" android:textColor="#000000" android:textSize="12dp" android:layout_weight="1"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/empTextView" style="@style/CICOTextView" android:layout_weight="2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/CITextView" style="@style/CICOTextView" android:text="" android:layout_weight="3"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/COTextView" style="@style/CICOTextView" android:text="" android:layout_weight="4"/> </TableRow> </TableLayout> </LinearLayout> 

कृपया मुझे समस्या से छुटकारा पाने में मदद करें। (ListViewCheckBox एक वर्ग है जो सूची तैयार कर रहा है और DT_selected और outDT_selected चर में दिनांक और समय के मूल्य को संचित कर रहा है)।

वेब के समाधान से एकत्रित समाधान "सूची दृश्य के माध्यम से डायनामिक रूप से जेनरेट किए गए चेकबॉक्स को चेक करते समय कोई समस्या हो रही है"

मैंने अपने जवाब को संपादित किया है ताकि आम जानकारी शीर्ष पर स्थित हो। आपको नीचे दिए गए इस प्रश्न का वास्तविक उत्तर मिलेगा …


यहां वास्तविक विचार और रीसाइक्लिंग की प्रक्रिया है ताकि आप यह समझ सकें कि आपके कार्यान्वयन और getView विचार (और शायद दूसरों को भी जब वे इस प्रश्न और उत्तर पाएंगे) में क्या गलत है। एक कोड उदाहरण के लिए नीचे देखें, बस टाइप भाग को अनदेखा करें क्योंकि यह एक अतिरिक्त जानकारी है

  • चरण 1: रीसाइक्लिंग के लिए आइटम सृजन ( convertView null ):
    इसका अर्थ है कि आप लेआउट और सामान्य स्थिति बनाते हैं जो सभी वस्तुओं द्वारा साझा की जाती है। यदि आपके पास श्रोताओं हैं तो आपने उन्हें यहां जोड़ दिया है और उन्हें उस तरीके से डिज़ाइन किया है कि वे बाद में स्थिति परिवर्तन (जब इसका पुन: उपयोग किया जाता है) पर प्रतिक्रिया दे सकते हैं। उदाहरण के लिए, इसी दृश्य पर टैग के रूप में स्थिति को सेट करके, ताकि श्रोता इस जानकारी को पकड़ सके और यह पता लगा सके कि वर्तमान में वह कौन सा आइटम काम कर रहा है आप डेटा को स्टोर करने के लिए विचारों का उपयोग नहीं कर सकते इसलिए जब श्रोता एक सूची आइटम पर कोई राज्य बदलता है, तो आपको इस डेटा को जारी रखना चाहिए (डेटा एरे में, SQLite डेटाबेस में, आदि) और इसे चरण 2 में उपयोग करें।

  • चरण 2: दी गई स्थिति के लिए सेटअप आइटम स्थिति:
    आप आइटम के लिए विज़ुअल स्टेट सेट करें एक वस्तु (पाठ, चेक बॉक्स राज्य, रंग, आदि) के लिए व्यक्तिगत रूप से जो कुछ भी बदल सकता है उसे यहां सेट करना होगा। न केवल वर्तमान आइटम के लिए क्या बदल गया है, बल्कि किसी अन्य आइटम से बदला जा सकता है। इस तरह आप यह सुनिश्चित कर लें कि दृश्य का उपयोग किसी अमान्य स्थिति में नहीं किया गया है क्योंकि इससे पहले किसी अन्य सूची आइटम से इसका पुन: उपयोग किया जा रहा है


अभिस्वीकृत उत्तर हटाए गए / संपादित किया गया था, लेकिन getItemViewType और getViewTypeCount को लागू करने के लिए सुझाव दिया गया था ताकि प्रत्येक सूची आइटम का अपना दृश्य प्रकार हो। संपादित जवाब दिखाता है कि समस्या को हल करने के तरीके के बारे में यहां बताया गया है।

GetItemViewType और getViewTypeCount काम करता है, लेकिन इसका उपयोग स्पष्ट रूप से गलत तरीके से किया गया है (इसके नीचे और उदाहरण के तुलना में और / या इस उत्तर की तुलना करें)।

इन दोनों विधियां दो (या अधिक) सूची आइटमों का उपयोग करने के लिए हैं जो पूरी तरह से एक दूसरे से अलग होती हैं (उदाहरण के लिए एक सामान्य सूची आइटम और एक विभाजक जिसमें एक शीर्षक केवल शामिल है) और एक दृश्य के रीसाइक्लिंग से बचने के लिए नहीं, जिसे पुन: उपयोग किया जा सकता है

अगर आप अपनी समस्या को सुलझाने के लिए वैसे भी उनका उपयोग कर रहे हैं, तो संभवत: उस प्रक्रिया को समझ में नहीं आया जिसका मैंने पहले समझाया था। तो उदाहरण के लिए आपके पास 1000 आइटम हैं और आप दृश्य प्रकार हैक करते हैं, तो आप शायद 10 के बजाय 1000 दृश्य (पदानुक्रम) का निर्माण कर रहे हैं, जो आसानी से पुन: उपयोग किए जा सकते हैं इससे कोई फर्क नहीं पड़ेगा कि आपके पास केवल 20 आइटम हैं या यदि आप बड़ी सूचियों के लिए उस तकनीक का इस्तेमाल करते हैं तो आप बस (बहुमूल्य) स्मृति बर्बाद कर रहे हैं!

यहां एक उदाहरण है:

 void getItemViewType(int position) { return isItemAtPositionSeperator(position) ? 1 : /* normal item */ 0; } void int getViewTypeCount() { return 2; // normal item and separator } void View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); // phase 1: see my explanation if (convertView == null) { if (type == 0) { // setup your common item view - inflate it and set to convertView } else { // setup separator view - inflate it and set to convertView } } // phase 2: see my explanation if (type == 0) { // set the state of the common item view based on the position // rely on the fact that convertView contains the view hierarchy // you created in convertView == null && type == 0 } else { // set state of the separator based on the position // rely on the fact that convertView contains the view hierarchy // you created in convertView == null && type != 0 (else part) } return convertView; } 

प्रश्न का वास्तविक उत्तर …

मुझे पता है कि समस्या क्या है लेकिन अभी एक सुरुचिपूर्ण समाधान के बारे में नहीं सोच सकता …

आपकी समस्या यह है कि आप देखें श्रोता के साथ एक बार क्लिक श्रोता सेट करते हैं। viewHolder.checkbox.setOnCheckedChangeListener जब दृश्य बनाया जाता है। तो जब आप स्क्रॉल करते हैं, तो वस्तुओं के पुनर्नवीनीकरण / पुन: उपयोग किया जाता है और क्लिक व्यवहार गलत सूची आइटम पर लागू होता है।

बाहरी final position का उपयोग करके स्थिति को कठोर करने की कोशिश न करें return से पहले viewHolder.checkbox.setTag(position) स्थापित करने का प्रयास करें और उसके बाद position+1 बजाय (Integer) buttonView.getTag() उपयोग करें। इसलिए आपके पुनर्नवीनीकरण दृश्य वास्तविक स्थिति को बनाए रखेंगे।

जब आप एक चेकबॉक्स पर क्लिक करते हैं, तो आपको राज्य को कहीं और बनी रहनी चाहिए। इसके लिए यूआई स्थिति पर भरोसा मत करो (क्योंकि इसका पुनर्नवीनीकरण किया जाएगा)। तो return से पहले कॉल viewHolder.checkbox.setChecked(persistedState) करें viewHolder.checkbox.setChecked(persistedState)

मुझे उम्मीद है कि यह समझ में आता है और आपको ये विचार मिलता है … 😉

इसे इस्तेमाल करे,

एक POJO वर्ग बनाएँ जो इस तरह से चेकबॉक्स चयनित आइटम्स की स्थिति बनाए रखेगा,

 public class Model { private String name; private boolean selected; public Model(String name) { this.name = name; selected = false; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } } 

और यह सामान है जिसे आपको getView() विधि पर लागू करना getView()

 public View getView(int position, View convertView, ViewGroup parent) { checkBoxCounter = 0; checkBoxInitialized = 0; if (convertView == null) { final ViewHolder viewHolder = new ViewHolder(); LayoutInflater inflator = context.getLayoutInflater(); convertView = inflator.inflate(R.layout.main, null); viewHolder.text = (TextView) convertView.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); if(checkBoxCounter <= checkBoxInitialized){ // increment counter, when we scroll the List it execute onCheckedChanged everytime so by using this stuff we can maintain the state checkBoxCounter++; } else{ Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); if(element.isSelected()) Toast.makeText(getContext(), "You selected "+ element.getName(), Toast.LENGTH_LONG).show(); else Toast.makeText(getContext(), "Not selected "+ element.getName(), Toast.LENGTH_LONG).show(); } } }); convertView.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); } else{ ((ViewHolder) convertView.getTag()).checkbox.setTag(list.get(position)); } ViewHolder viewHolder = (ViewHolder) convertView.getTag(); viewHolder.text.setText(list.get(position).getName()); viewHolder.checkbox.setChecked(list.get(position).isSelected()); return convertView; } 

यह कैसे काम करता है इस बारे में और अध्ययन के लिए आप संपूर्ण उदाहरण पर एक नज़र डाल सकते हैं। और यह भी कि आप कैसे ListView वर्क्स पर एक नजर डाल सकते हैं

अद्यतनः मैंने हाल ही में ब्लॉग द्वारा इस प्रकार के मुद्दे के लिए एक समाधान जोड़ा है चेकबॉक्स स्कॉलिंग अंक के साथ सूची दृश्य

इस लिंक पर जाएं और एकल वीआरएस मल्टीसेबॉलेशन पर जाएं। यहां आप listview में चेकबॉक्स का उपयोग करने के लिए बहुत अच्छे उदाहरण पाते हैं

(सिंगल वीआरएस मल्टीसेकिंग पर स्क्रॉल करें)

http://www.vogella.de/articles/AndroidListView/article.html

और भी

कस्टम सरल कर्सर बाध्यकारी के साथ सूची दृश्य में चेकबॉक्स