एंड्रॉइड: कस्टम सूची एडाप्टर में स्विच के साथ समस्या - एंड्रॉइड, सूचीदृश्य, डिबगिंग, ऑब्जेक्ट, स्विच-कथन

मेरे पास एक टेम्पलेट पेज है और इस पृष्ठ पर मैं टेम्पलेट्स को नाम और विवरण देकर जोड़ और हटा सकता हूं।

प्रत्येक टेम्पलेट एक वस्तु है जिसमें नाम, विवरण, शक्ति और सक्षम होता है।

  • टेम्पलेट पर क्लिक करने से विकल्पों के साथ एक और सूची दृश्य लोड होता है।
  • प्रत्येक विकल्प विकल्प नामक ऑब्जेक्ट का एक उदाहरण है।
  • प्रत्येक विकल्प में एक स्विच होता है जिसे मैं टॉगल कर सकता हूं।
  • जब मैं टेम्पलेट को सहेजता हूं, तो मैं डेटाबेस मानों में अद्यतन करता हूं कि क्या वे स्विच चालू या बंद थे या नहीं।

समस्या के लिए सही कूद।

हम पहले टेम्पलेट सूची दृश्य को पीछे ले जा सकते हैं लेकिन अगले एक पर, विकल्प सूची दृश्य।

इस सूची दृश्य में केवल 2 विकल्प हैं, पावर और सक्षम करें। यहां बताया गया है कि मैं इन विकल्पों को कैसे बना सकता हूं।

TEMPLATEPOWER("Turn on device", "Switching this will turn on and off the fitting"),
TEMPLATEENABLED("Enable Device", "Switching this will enable and disable the device");
  • सरल शब्दों में, यह सिर्फ एक enum है
  • मेरे पास एक नियंत्रण विकल्प है जो इस enum को संभालता है।

नियंत्रण फ़ाइल:

  public ArrayList<Option> populateTemplateActions() {
actions.add(Option.TEMPLATEPOWER);
actions.add(Option.TEMPLATEENABLED);
return actions;
}

अब सूची दृश्य सेट करने के लिए। यह करने के लिए:

  • मैं विकल्पों की एक सरणी बना देता हूं और इन enum ऑब्जेक्ट्स को सरणी में जोड़ने के लिए उपर्युक्त विधि को कॉल करता हूं
  • मैं फिर इस सरणी को एडाप्टर पर पास करता हूं।
  • मैं टुकड़े को भी पास करता हूं, क्योंकि मुझे टेम्पलेट ऑब्जेक्ट को टुकड़े में सेट करने में सक्षम होना चाहिए।

सरणी populating:

templateOptions = control.populateTemplateActions();

सूची दृश्य बनाना:

adapter = new TemplateOptionAdapter(
getActivity(), templateOptions, template, ViewTemplate.this);
templateOptionsView.setAdapter(adapter);

adapter.notifyDataSetChanged();

एक बार जब मैं एडाप्टर में हूं तो मैंने टेक्स्ट दृश्य और स्विच सेट किया। मैं फिर स्विच पर परिवर्तन श्रोता का उपयोग कर बिजली स्थापित करने और विकल्पों को सक्षम करने के साथ सौदा करता हूं।

  • मैं पहले यह देखने के लिए विकल्प पंक्ति ऑब्जेक्ट की जांच करता हूं कि यह एक है या नहीं) पावर या बी) सक्षम करें।
  • मैं फिर इसे चेक करने या चेक करने के लिए सेट करता हूं।
  • श्रोता तब परिवर्तनों को सुनता है, और जब परिवर्तन होते हैं तो तदनुसार विधियां सेट होती हैं।
  • मैं फिर इस बदली हुई ऑब्जेक्ट को उस खंड में वापस भेजता हूं जिसमें सूची दृश्य होता है, इसलिए मैं मानकों को डेटाबेस में सम्मिलित कर सकता हूं।

पूरी तरह से होने के लिए, मैं नीचे संपूर्ण एडाप्टर कोड पोस्ट करूंगा:

public class TemplateOptionAdapter extends BaseAdapter {

private Context context;
private ArrayList<Option> templateList;
private String name;
private Template template;
private Boolean checked;
int power;
int enable;
Option option;
ViewTemplate viewTemplate;

public TemplateOptionAdapter(Context context, ArrayList<Option> list, Template template, ViewTemplate viewTemplate) {
this.context = context;
templateList = list;
this.template = template;
this.viewTemplate = viewTemplate;
}

@Override
public int getCount() {

return templateList.size();
}

@Override
public Object getItem(int position) {

return templateList.get(position);
}

@Override
public long getItemId(int position) {

return position;
}

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
option = templateList.get(position);

if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.template_option_view_row, null);

}
TextView templateName = (TextView) convertView.findViewById(R.id.option_name);
TextView templateDesc = (TextView) convertView.findViewById(R.id.option_info);
SwitchCompat optionSwitch = convertView.findViewById(R.id.optionSwitch);

name = option.getOptionName();
String description = option.getOptionDesc();

templateName.setText(name);
templateDesc.setText(description);

power = template.getTemplatePower();
enable = template.getTemplateStatus();

// Sets switches to their database values
switch (option) {
case TEMPLATEPOWER:
if (power == 0) {
optionSwitch.setChecked(false);
}

else {
optionSwitch.setChecked(true);
}
break;
case TEMPLATEENABLED:
if (enable == 0) {
optionSwitch.setChecked(false);
}

else {
optionSwitch.setChecked(true);
}
break;
}

// Monitors changing of switches and sets objects to be saved.

optionSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checked = true;
switch (option) {
case TEMPLATEPOWER:
template.setTemplatePower(1);
Log.i("power", "power setting to 1" + "");
Log.i("enable", "enable dosnt change" + "");
break;
case TEMPLATEENABLED:
template.setTemplateStatus(1);
Log.i("power", "power dosnt change" + "");
Log.i("enable", "enable setting to 1" + "");
break;
}
} else {
checked = false;
switch (option) {
case TEMPLATEPOWER:
template.setTemplatePower(0);
Log.i("power", "power setting to 1" + "");
Log.i("enable", "enable dosnt change" + "");
break;
case TEMPLATEENABLED:
template.setTemplateStatus(0);
Log.i("power", "power dosnt change" + "");
Log.i("enable", "enable setting to 0" + "");
break;
}
}
}

});

viewTemplate.setTemplate(template);
return convertView;
}

वाह, अगर तुम अभी भी मेरे साथ महान हो, धन्यवाद!

ठीक है तो हाथ में समस्या है।

जब मैं सूची दृश्य वाले खंड में वापस आ जाता हूं, जब मैं सहेजने के लिए एक बटन क्लिक करता हूं: इससे कोई फर्क नहीं पड़ता कि मैं टॉगल, पावर या सक्षम करता हूं, सक्षम विकल्प एकमात्र मूल्य है जो बदलता है। उदाहरण के लिए:

  • अगर मैं चालू करने के लिए शक्ति सेट करता हूं, तो इसके बजाय सक्षम करने के लिए सक्षम है।
  • अगर मैं बंद करने के लिए सेट सेट करता हूं, तो इसके बजाय सक्षम सेट बंद कर दिया जाता है।

तो मेरे स्विच स्टेटमेंट में, ऐसा लगता है कि टेम्पलेट पावर कभी नहीं देखा जाता है, भले ही यह विकल्पों में से एक है।

मैं एक रूकी एंड्रॉइड डेवलपर हूं, मुझे यकीन है कि यह मेरे तर्क में एक दोष है, मैं बस नहीं देख सकता!

कोई सलाह अद्भुत होगी, धन्यवाद!

यदि आपको और स्पष्टीकरण की आवश्यकता है, तो बस पूछें :)

उत्तर:

जवाब के लिए 0 № 1

इस पूरे समारोह को करने के बेहतर तरीके हो सकते हैं, लेकिन मेरे मामले को ठीक करने की कोशिश करने के कुछ घंटों के बाद, मैंने कुछ प्रबंधित किया है।

जहां मुझे एडाप्टर में सूची स्थिति के साथ ऑब्जेक्ट विकल्प मिल रहा था, मुझे इसे अंतिम पर सेट करना चाहिए था, क्योंकि यह मूल्य बदल रहा था।

मैं बदल गया:

option = templateList.get(position);

सेवा मेरे:

final Option option = templateList.get(position);

संबंधित सवाल
सबसे लोकप्रिय