2012-11-11 14 views
5

मैं एक बटन दबाए जाने के बाद अलग-अलग सामग्री के साथ अपनी सूचीदृश्य में एक पंक्ति को अपडेट करना चाहता हूं। मुझे पता है कि मैं notifydatasetchanged( का उपयोग कर सकता हूं) लेकिन यह पूरे listView को अपडेट करेगा।ListView एक पंक्ति को अपडेट करना

मैंने यह answer पढ़ा है और यह मैं जो करना चाहता हूं उसके लिए पूरी तरह से फिट बैठता है।

मैंने 5 पंक्तियों के साथ एक सूचीदृश्य किया है और जब मैं बटन दबाता हूं तो मैं 4 वें पंक्ति को एक अलग पाठ के साथ अपडेट करना चाहता हूं। मैं प्रोग्राम को प्रोग्रामिक रूप से सेट नहीं करना चाहता क्योंकि यह सिर्फ एक डमी प्रोजेक्ट है, यह देखने के लिए कि क्या एक पंक्ति को रीफ्रेश करना संभव है और मेरी वास्तविक परियोजना सिर्फ textview से कहीं अधिक जटिल है।

तो मेरा सवाल है: क्या मैं getView() का उपयोग listview में एक पंक्ति को अपडेट करने के लिए कर सकता हूं?

यहाँ मेरी कोड है:

मेरी गतिविधि:

public class MainActivity extends Activity { 

    public ListView list1; 
    public listAdapter adapter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list1 = (ListView) findViewById(R.id.my_list); 
     adapter = new listAdapter(this); 
     list1.setAdapter(adapter); 

     Button button1 = (Button) findViewById(R.id.my_button); 
     button1.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       adapter.setText("Different text"); 
       View row2Update = list1.getChildAt(3); 
       list1.getAdapter().getView(3, row2Update, list1); 

      } 
     }); 

    } 

} 

मेरी अनुकूलक:

012:

public class listAdapter extends BaseAdapter{ 

    public Activity activity; 
    public String text="Normal Text"; 

    public listAdapter(Activity activity){ 

     this.activity = activity; 
    } 

    public void setText(String text){ 
     this.text = text; 
    } 

    public int getCount() { 
     return 5; 
    } 

    public Object getItem(int position) { 

     return null; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
     TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
     textView.setText(text); 
     return rowView; 
    } 

} 

इस गतिविधि को कैसा दिखता है

लेकिन जब मैं प्रेस मेरी बटन कोई अन्य परिवर्तन नहीं

उत्तर

3

आप नहीं कर सकते कॉल getView() अनुकूलक अपने आप को विधि। एडाप्टर के getView() विधि केवल, कहा जाता है जब

  • सूचीदृश्य बनाने
  • जब उपयोगकर्ता स्क्रॉल सूची दृश्य
  • जब notifysetdatachanged() कहा जाता है।
    ये सभी ओएस द्वारा किए जाते हैं। GetView() को सूचीदृश्य में सभी पंक्तियों के लिए बुलाया जाता है। इसे सिर्फ एक पंक्ति के लिए नहीं कहा जाता है।इसलिए, यदि आप पंक्तियों को बदलना चाहते हैं, तो आपको डेटा को फिर से String[], ArrayList<> आदि
    पर प्रदान करना होगा यदि आप एक पंक्ति के लिए अलग-अलग पाठ के लिए अलग-अलग पाठ दिखाना चाहते हैं, तो बटन पर क्लिक करें - आप यह

    कर सकते हैं

    सार्वजनिक वर्ग listAdapter फैली BaseAdapter {

    public Activity activity; 
    public ArrayList<String> text; 
    
    public listAdapter(Activity activity){ 
    
        this.activity = activity; 
    } 
    
    public void setText(ArrayList<String> text){ 
        this.text = text; 
    } 
    
    public int getCount() { 
        return 5; 
    } 
    
    public Object getItem(int position) { 
    
        return null; 
    } 
    
    public long getItemId(int position) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 
    
    public View getView(int position, View convertView, ViewGroup parent) { 
        LayoutInflater inflater = activity.getLayoutInflater(); 
        LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
        TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
        textView.setText(text[position]); 
        return rowView; 
    } 
    

    }
    और अपनी गतिविधि में:

    list1 = (ListView) findViewById(R.id.my_list); 
    adapter = new listAdapter(this); 
    String[] entries={"Normal Text","Normal Text","Normal Text","Normal text","Normal text"}; 
    ArrayList<String> text=Arrays.asList(entries); 
    adapter.setText(text); 
    list1.setAdapter(adapter); 
    
    Button button1 = (Button) findViewById(R.id.my_button); 
    button1.setOnClickListener(new OnClickListener() { 
    
        public void onClick(View v) { 
         text.set(3,"Different Text"); 
         adapter.setText(text); 
         list1.setAdapter(adapter); 
    
        } 
    }); 
    


    यह भी ऐसा करने का एक और तरीका है @Andy टिप्पणियों में से एक में सुझाव के रूप में नहीं है: बोल्ड पाठ के लिए

    listViewPeople.setOnItemClickListener(new ListView.OnItemClickListener() { 
         @Override 
        public void onItemClick(AdapterView<?> a, View v, int position, long l) { 
          //IF YOU WANT TO CHANGE THE CONTENT OF THE ROW CLICKED 
         if(position == someNumber) { 
           text.set(position,"different Text"); 
           list1.setAdapter(text); 
         } 
        } 
    }); 
    

क्षमा करें। किसी कारण से CTRL + K उपरोक्त कोड के लिए काम नहीं कर रहा है।

+0

ग्रेट उत्तर। मैं आपसे सहमत हुँ। एक और चीज जो वह कर सकती थी वह सिर्फ इटैमक्लिक लिस्टनर पर लिस्ट व्यू पर सेट है, और यदि स्थिति कुछ भी है (मान लीजिए कि आप एक बटन का उपयोग नहीं करते हैं), तो आप एडाप्टर में सूची को अपडेट करें। बेशक आखिरकार उन्हें यह पता लगाने की जरूरत है कि उनके लिए कौन सा विकल्प सबसे अच्छा है। – Andy

+0

@ एंडी: आप सही हैं। असल में यह बेहतर विचार होगा। लेकिन चूंकि, उन्होंने विशेष रूप से बटन के क्लिक पर पंक्ति सामग्री को बदलने के लिए कहा, मैं इसके लिए गया। – Ashwin

+0

:) ओह नहीं, आप तकनीकी रूप से सही @Ashwin हैं क्योंकि यह अधिक कुशल है। कोई अनावश्यक काम नहीं किया जा रहा है। चूंकि वह केवल एक लाइन को अपडेट करना चाहता है। लेकिन वह उल्लेख करता है कि यह केवल एक परीक्षण है, इसलिए मुझे लगता है कि उसे एक और विधि भी शामिल करनी चाहिए जिसमें वह और अधिक अपडेट होना चाहता है। – Andy

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