2011-06-27 13 views
28

मैं एंड्रॉइड में एक भिखारी हूं लेकिन मैंने कस्टम सूचीदृश्य फ़िल्टरिंग करने की कोशिश की और मैंने इसे किसी भी तरह से काम किया। मेरे पास एकमात्र समस्या यह है कि ArrayList कि मैंने सभी मान ("मूल" ArrayList) रखा है, प्रत्येक फ़िल्टरिंग में वस्तुओं पर कम और कम हो रहा है। मैं इसे समझा नहीं सकता लेकिन मैंने सोचा कि आप किसी भी तरह मेरी मदद कर सकते हैं।सूची फ़िल्टर में कस्टम फ़िल्टरिंग ऐरेएडाप्टर

वैसे भी यहाँ

कस्टम ArrayAdaptor है:

public class PkmnAdapter extends ArrayAdapter<Pkmn> { 

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

public PkmnAdapter(Context context, int textViewResourceId, ArrayList<Pkmn> items) { 
     super(context, textViewResourceId, items); 
     this.original = items;//new ArrayList<Pkmn>(); 
     this.fitems = items;//new ArrayList<Pkmn>(); 
} 

@Override 
public void add(Pkmn item){ 
    original.add(item); 
} 

@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.row, null); 
     } 
     Pkmn pkmn = original.get(position); 
     if (pkmn != null) { 
       TextView tt = (TextView) v.findViewById(R.id.RlabPName); 
       TextView dex = (TextView)v.findViewById(R.id.RlabDex); 
       ImageView img = (ImageView)v.findViewById(R.id.RimgPkmn); 

       if (tt != null) { tt.setText(pkmn.getName()); } 
       if (dex != null){ dex.setText(CalcDex(pkmn.getId())); } 
       if (img != null){ 
        int resId = getContext().getResources().getIdentifier("dex" + pkmn.getId(), "drawable", "com.compileguy.pokebwteam"); 
        img.setImageResource(resId); 
       } 
     } 
     return v; 
} 

@Override 
public Filter getFilter() 
{ 
    if (filter == null) 
     filter = new PkmnNameFilter(); 

    return filter; 
} 

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

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

       int count = list.size(); 
       final ArrayList<Pkmn> nlist = new ArrayList<Pkmn>(count); 

       for (int i=0; i<count; i++) 
       { 
        final Pkmn pkmn = list.get(i); 
        final String value = pkmn.getName().toLowerCase(); 

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

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

      if (fitems.size() > 0) 
       notifyDataSetChanged(); 
      else 
       notifyDataSetInvalidated(); 
     } 

    } 


private String CalcDex(int id){ 
    String s = String.valueOf(id); 
    if (s.length() == 1) 
     s = "00"+s; 
    else if (s.length() == 2) 
     s = "0"+s; 
    return '#'+s; 
} 

}

नोट: सूचीदृश्य सही ढंग से आइटम दिखा रही है, लेकिन जब exaple के लिए मैं editbox में एक पत्र निकाल सकते हैं (जो छानने से चलाता है) इस वह समस्या है जहां समस्याएं शुरू होती हैं।

--- संपादित करें ---

@Janusz: आपके उत्तर के लिए बहुत धन्यवाद। यह मेरी समस्या हल हो गई।

यहाँ स्रोत कोड है कि मेरे लिए काम करता है, तो वे इस एक कोशिश कर सकते है, तो किसी को भी एक ही मुद्दा है:

this.original = items; 
this.fitems = items; 

आइटम है:

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

public PkmnAdapter(Context context, int textViewResourceId, ArrayList<Pkmn> items) { 
     super(context, textViewResourceId, items); 
     this.original = new ArrayList<Pkmn>(items); 
     this.fitems = new ArrayList<Pkmn>(items); 
} 

@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.row, null); 
     } 
     Pkmn pkmn = fitems.get(position); 
     if (pkmn != null) { 
       TextView tt = (TextView) v.findViewById(R.id.RlabPName); 
       TextView dex = (TextView)v.findViewById(R.id.RlabDex); 
       ImageView img = (ImageView)v.findViewById(R.id.RimgPkmn); 

       if (tt != null) { tt.setText(pkmn.getName()); } 
       if (dex != null){ dex.setText(CalcDex(pkmn.getId())); } 
       if (img != null){ 
        int resId = getContext().getResources().getIdentifier("dex" + pkmn.getId(), "drawable", "com.compileguy.pokebwteam"); 
        img.setImageResource(resId); 
       } 
     } 
     return v; 
} 

@Override 
public Filter getFilter() 
{ 
    if (filter == null) 
     filter = new PkmnNameFilter(); 

    return filter; 
} 

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

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

       for (int i=0; i<count; i++) 
       { 
        final Pkmn pkmn = list.get(i); 
        final String value = pkmn.getName().toLowerCase(); 

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

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      fitems = (ArrayList<Pkmn>)results.values; 

      clear(); 
      int count = fitems.size(); 
      for (int i=0; i<count; i++) 
      { 
       Pkmn pkmn = (Pkmn)fitems.get(i); 
       add(pkmn); 
      } 
     } 

    } 
} 
+0

'स्पष्ट()' और 'जोड़ने()' समारोह का काम है क्या। –

+0

@compileGuy, इसका मतलब क्या है "पीकेएमएन"? मैं इस उदाहरण को नहीं चला सकता। क्या आप कोड को पूरी तरह से अपलोड कर सकते हैं? –

+0

उत्कृष्ट कार्यान्वयन @compileguy, एडाप्टर द्वारा कार्यक्षमताएं जोड़ें और स्पष्ट हैं, आपको उन्हें ओवरराइड करने की आवश्यकता नहीं है। pkmn सूची में डेटा मान रखने के लिए एक मॉडल वर्ग है – Naruto

उत्तर

16

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

आप उपयोग कर सकते हैं:

this.fitems = new ArrayList(items); 

है कि एक नए सूची और इस सूची में परिवर्तन केवल fitems सूची बदल जाएगा उत्पन्न करनी चाहिए।

+0

धन्यवाद जनुज़, यह शानदार धन्यवाद बहुत काम करता है – Naruto

+0

मेरे लिए काम नहीं कर रहा है, मेरी सूची दृश्य गायब हो जाती है और जब मैं पूरी स्ट्रिंग को हटाता हूं तो यह नहीं आता है फिर से वापस। http://stackoverflow.com/questions/20524417/listview-is-blank-while-using-getfilter- कार्यक्षमता – Si8

+0

@ SiKni8 मुझे भी वही परिणाम मिल रहा है। कृपया सहायता कीजिए –

2

आप अपने पीकेएमएन क्लास पर केवल toString() विधि बनाकर एक ही प्रभाव प्राप्त कर सकते हैं जो उस मूल्य को लौटाता है जिसे आप फ़िल्टर करना चाहते हैं।

private class MyFilter extends Filter 

तो उस समारोह में फिल्टर के बाद प्रदर्शित करने के लिए नई वस्तु सारिणी निर्मित (आप में अच्छा कार्यान्वयन पा सकते हैं:

0

सबसे अच्छा तरीका है मैं फिल्टर करने के लिए करने के लिए ArrayAdapter पाया मेरे अपने फिल्टर वर्ग बनाने के लिए है class ArrayAdapter के स्रोत कोड)

@Override 
protected FilterResults performFiltering(CharSequence prefix) 

अब चाल इस विधि में है

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) 

जब आप सरणी एडाप्टर का उपयोग आप ऐसा नहीं कर सकते:

myAdapterData = results.values 

के बाद से तो आप सुपर डेटा से अपने डेटा को डिस्कनेक्ट करें, आप सुपर मूल डेटा सरणी के संदर्भ रखने के लिए यह करना चाहिए:

data.clear(); 
data.addAll((List<YourType>) results.values); 

और फिर ओवरराइड

getFilter()

अपने एडाप्टर में, उदाहरण के लिए:

@Override 
public Filter getFilter() { 
    if (filter == null) { 
     filter = new MyFilter(); 
    } 
    return filter; 
} 
संबंधित मुद्दे