2012-08-07 21 views
5

के बाद रीफ्रेश नहीं करता है इसलिए मेरे पास कस्टम ArrayAdapter है इसलिए मैं शीर्षक/उपशीर्षक दृश्य का उपयोग कर सकता हूं जो ListView पर उपलब्ध है। मेरे पास EditText है जो एक स्ट्रिंग स्वीकार करता है और एडाप्टर फ़िल्टर करता है।एंड्रॉइड कस्टम ऐरेएडाप्टर फ़िल्टर

फिल्टर अर्थ है कि यह सही वस्तुओं फ़िल्टर कर रही है में काम करता है (मैं उस पर क्लिक करके बता सकते हैं और यह सही "अतिरिक्त" के साथ आशय शुरू होता है।)

हालांकि भी फ़िल्टर कार्यप्रणाली हालांकि, एडाप्टर में आइटम सही जानकारी प्रदर्शित करने के लिए अद्यतन नहीं हैं ... शीर्षक और उपशीर्षक गलत हैं।

मान लें कि हमारे पास ListView पर 0 से 9 आइटम हैं, मैं एक खोज के साथ 3 आइटम फ़िल्टर करता हूं, और कहता हूं कि फ़िल्टर किए गए आइटम 5, 6, 9 हैं ... 3 आइटम प्रदर्शित होते हैं, लेकिन यह पहला 3 है मूल प्री-सर्च ListView (0-2) के आइटम। यदि मैं आइटम 2 (तीसरा आइटम) पर क्लिक करता हूं, तो 9 की सामग्री नए इरादे में निहित है। यह खोज मानदंडों के लिए सही है, हालांकि शीर्षक ने सही जानकारी को प्रतिबिंबित किया है।

मुझे यकीन नहीं है कि मुझे ListView को ताज़ा करने के लिए क्या कहना है। मुझे नहीं लगता कि इसकी notifyDataSetChanged();

किसी भी मदद की सराहना की जाती है। धन्यवाद!

public class myListAdapter extends ArrayAdapter<Pizza>{ 
    private ArrayList<Pizza> items; 
    private PizzaViewHolder myListHolder; 

    private class PizzaViewHolder{ 
     TextView title; 
     TextView subtitle; 
    } 

    public myListAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { 
     super(context, textViewResourceId, items); 
     this.items = items; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent){ 
     View v = convertView; 
     if(v == null){ 
      LayoutInflater vi = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.myList_item, null); 
      myListHolder = new PizzaViewHolder(); 
      myListHolder.title = (TextView)v.findViewById(R.id.title); 
      myListHolder.subtitle = (TextView)v.findViewById(R.id.subtitle); 
      v.setTag(myListHolder); 
     }else myListHolder = (PizzaViewHolder)v.getTag(); 

     Pizza myList = items.get(pos); 

     if (myList != null){ 
      myListHolder.title.setText(myList.getTitle()); 
      myListHolder.subtitle.setText(myList.getSubTitle()); 
     }  
     return v;   
    } 
} 

इस खोज

private TextWatcher filterTextWatcher = new TextWatcher(){ 

    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 
     if(!s.equals("")){ 
      ((Filterable) this.listView1.getAdapter()).getFilter().filter(s); 
      } 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     // TODO Auto-generated method stub 

    } 

}; 
+0

एक मानक एडाप्टर का उपयोग करना ठीक काम करता है, अधिसूचना का उपयोग करने की आवश्यकता नहीं हैडेटासेट चेंज किया गया, मेरा कस्टम एडाप्टर –

उत्तर

13

मैं क्या निर्धारित किया है से, ऐसा लगता है कि मैं अपने कस्टम ArrayAdapter के लिए एक कस्टम फिल्टर की जरूरत है। कस्टम ArrayAdapter फ़िल्टर का एक ओवरराइड कार्यान्वयन है, यहाँ कोड है:

import java.util.ArrayList; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.TextView; 

public class PizzaAdapter extends ArrayAdapter<Pizza>{ 

private ArrayList<Pizza> original; 
private ArrayList<Pizza> fitems; 
private Filter filter; 


public PizzaAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { 
    super(context, textViewResourceId, items); 

    this.original = new ArrayList<Pizza>(items); 
    this.fitems = new ArrayList<Pizza>(items); 
    this.filter = new PizzaFilter(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    View v = convertView; 

    if(v == null){ 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.pizza_list_item, null); 
    } 

    Pizza pizza = fitems.get(position); 

    if(pizza != null){ 
     String subtitleString = new String("[" + pizza.getPizzaType() + "] " + pizza.getPizzaCategory() + ": " + pizza.getPizzaCode()); 

     TextView title = (TextView)v.findViewById(R.id.title); 
     TextView subtitle = (TextView)v.findViewById(R.id.subtitle); 

     if(title != null){ 
      title.setText(pizza.getPizzaName()); 
     } 
     if(subtitle != null){ 
      subtitle.setText(subtitleString); 
     } 
    } 
    return v; 
} 

@Override 
public Filter getFilter(){ 

    if(filter == null){ 
     filter = new PizzaFilter(); 
    } 
    return filter; 
} 

private class PizzaFilter extends Filter{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint){ 
     FilterResults results = new FilterResults(); 
     String prefix = constraint.toString().toLowerCase(); 

     if (prefix == null || prefix.length() == 0){ 
      ArrayList<Pizza> list = new ArrayList<Pizza>(original); 
      results.values = list; 
      results.count = list.size(); 
     }else{ 
      final ArrayList<Pizza> list = new ArrayList<Pizza>(original); 
      final ArrayList<Pizza> nlist = new ArrayList<Pizza>(); 
      int count = list.size(); 

      for (int i = 0; i<count; i++){ 
       final Pizza pizza = list.get(i); 
       final String value = Pizza.getPizzaName().toLowerCase(); 

       if(value.contains(prefix)){ 
        nlist.add(pizza); 
       } 
       results.values = nlist; 
       results.count = nlist.size(); 
      } 
     } 
     return results; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     fitems = (ArrayList<Pizza>)results.values; 
     notifyDataSetChanged(); 
     clear(); 
     int count = fitems.size(); 
     for(int i = 0; i<count; i++){ 
      add(fitems.get(i)); 
      notifyDataSetInvalidated(); 
     } 
    } 
} 
} 

ऐसा नहीं है कि फिल्टर की एक कस्टम implmentation प्रदर्शन अद्यतन जब आप खोज पता चला है। उम्मीद है कि यह कुछ लोगों की मदद करेगा।

+3

रीफ्रेश नहीं करता है इंटरनेट पर सबसे अच्छा और सरल उदाहरण है। + – AlexAndro

+0

कोई विचार यह है कि मैं इसे हल करने के लिए अपने कोड का उपयोग कैसे कर सकता हूं: http://stackoverflow.com/questions/20524417/listview-is-blank-while-using-getfilter- कार्यक्षमता – Si8

+0

'स्ट्रिंग उपसर्ग = constraint.toString()। toLowerCase(); '' NullPointerException' फेंक सकता है – mallaudin

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