2012-06-20 15 views
5

यह प्रश्न इसी तरह के शीर्षक के अन्य लोगों से थोड़ा अलग है। मैं सूची में डेटा को अपडेट करने की कोशिश नहीं कर रहा हूं, मैं सूची के को अपडेट करने का प्रयास कर रहा हूं।सूचीदृश्य के पुनर्विक्रय को कैसे बल दें?

मेरा ऐप समर्थन पुस्तकालय का उपयोग कर आधारित टुकड़ा है। मेरे पास वरीयता सक्रियता है जहां मैं उपयोगकर्ता को उन रंगों को सेट करने की अनुमति देता हूं जिन्हें वे सूची में टेक्स्ट के लिए पसंद करते हैं (एडाप्टर वरीयता पढ़ता है और रंग सेट करता है)। यह अधिकांश भाग के लिए अपेक्षित के रूप में काम कर रहा है।

मेरे पास जो समस्या है, वह इस प्रकार है। जब मेरे पास स्क्रीन पर सूची है (यह एक सूचीफ्रेगमेंट है) और मेनू खींचें, प्राथमिकताएं चुनें और रंग वरीयता में बदलाव करें। वरीयता सक्रियता से सूची में वापस आने पर, मुझे सूची को नए रंग के साथ खुद को फिर से निकालने के लिए प्रतीत नहीं होता है।

यदि मैं सूची से दूर नेविगेट करता हूं और उस पर वापस आ जाता हूं, तो यह नए रंग के साथ पुन: उत्पन्न होता है।

मैं परिवर्तन करने के लिए onResume का उपयोग करने का प्रयास कर रहा हूं। कोड मैं वर्तमान में है (उस सूची के लिए कुछ भी करने के लिए प्रकट नहीं है, लेकिन एकदम सही ढंग से हैडर रंग बदल जाता है):

@Override 
public void onResume() { 
    super.onResume(); 
    header.setTextColor(MyApplication.header); 
    line.setBackgroundColor(MyApplication.header_line); 
    subheader.setTextColor(MyApplication.header); 
    getListView().invalidateViews(); 
} 

मैं invalidateViews और invalidate कोशिश की है। निराशा में मैंने एडाप्टर पर notifyDataSetChanged पर कॉल करने का प्रयास किया, भले ही डेटा में कोई बदलाव न हो। कुछ भी काम नहीं करता है।

क्या मुझे कुछ स्पष्ट याद आ रहा है, या ऐसा करने का कोई तरीका नहीं है?

संपादित

मेरी एडाप्टर से 'getView` विधि:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = View.inflate(context, layout, null); 
    View row = convertView; 
    c.moveToPosition(position); 
    TextView first = (TextView) convertView.findViewById(R.id.ListItem1); 
    TextView second = (TextView) convertView.findViewById(R.id.ListItem2); 
    TextView third = (TextView) convertView.findViewById(R.id.ListItem3); 
    TextView fourth = (TextView) convertView.findViewById(R.id.ListItem4); 

    DecimalFormat df = new DecimalFormat("0.00"); 
    Double hold = Double.valueOf(c.getString(3)); 
    Double qty = Double.valueOf(c.getString(1)); 
    Double total = hold * qty; 

    String color = "#FF00FF"; 
    first.setText(c.getString(2)); 
    first.setTextColor(MyApplication.shoplistitem_name); 
    second.setText(c.getString(4)); 
    second.setTextColor(MyApplication.shoplistitem_desc); 
    third.setText(c.getString(1)); 
    third.setTextColor(MyApplication.shoplistitem_qty); 
    fourth.setText("$" + df.format(total)); 
    fourth.setTextColor(MyApplication.shoplistitem_desc); 

    if (strikethroughState[position] == 1) { 
     first.setPaintFlags(first.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundColor(MyApplication.shoplistitem_checked); 
    } else { 
     first.setPaintFlags(first.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundResource(R.color.black); 
    } 
    return (row); 
} 

उत्तर

7

notifyDataSetChanged() निश्चित रूप से आपके लिए काम करना चाहिए। वरीयता परिवर्तन को आप कैसे प्रबंधित कर रहे हैं? यदि आप केवल साझा किए गए संदर्भों की वरीयता कर रहे हैं तो यह स्थिर MyAplication वैरिएबल को कभी अपडेट नहीं कर रहा है। क्या आप वरीयता निर्धारित करने के लिए उपयोग कर रहे कोड को पोस्ट कर सकते हैं? यदि आप इसका उपयोग नहीं कर रहे हैं, तो रंग बदलने के लिए onPreferenceChangedListener() सेट करें, जब यह स्थिर हो तो उस स्थिर चर को सेट करें।

+1

अच्छा ... इसने मेरी समस्या को हल करने का तरीका बताया ... और मुझे अविश्वसनीय रूप से बेवकूफ़ लगता है। मैं 'MyAplication.setPreferences' को कॉल कर रहा था। विधि 'MyAplication.setPrefs' है। * आह * – Barak

1

आप अपने एडाप्टर पर notifyDataSetChanged() फोन करना चाहिए।

+3

क्या आपने मेरी पोस्ट में हिस्सा याद किया जहां मैंने कहा कि मैंने कोशिश की और यह काम नहीं किया? बस इसे फिर से कोशिश की, वही। विचारों की कोई वापसी नहीं। – Barak

+0

क्या आप एडाप्टर से अपनी getView() विधि पोस्ट कर सकते हैं? – Gallal

+0

प्रश्न 'getView' विधि जोड़ने के लिए संपादित किया गया। – Barak

0

अमान्य, अमान्य अवलोकन, अधिसूचनाडेटाडेटेड, मेरे लिए काम नहीं किया! सिर्फ सूचीदृश्य (CursorAdapter के साथ) को अद्यतन करने के मैं सिर्फ कार्य करें:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); //optional, initial query 
adapter.changeCursor(cur); // or swapCursor(), cur is the initial and the only cursor 

लेकिन सही पृष्ठभूमि रंग है, drawable, पाठ रेखांकित, मैं सिर्फ कार्य करें:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); 
adapter.changeCursor(cur); 
list.setAdapter(adapter); //just like I did oncreate 

मैं बराक समाधान पसंद नहीं क्योंकि यह भारी वजन लगता है, और आवश्यकता होने पर कोड निष्पादित करता है।

संबंधित मुद्दे