मैं एंड्रॉइड में एक भिखारी हूं लेकिन मैंने कस्टम सूचीदृश्य फ़िल्टरिंग करने की कोशिश की और मैंने इसे किसी भी तरह से काम किया। मेरे पास एकमात्र समस्या यह है कि 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);
}
}
}
}
'स्पष्ट()' और 'जोड़ने()' समारोह का काम है क्या। –
@compileGuy, इसका मतलब क्या है "पीकेएमएन"? मैं इस उदाहरण को नहीं चला सकता। क्या आप कोड को पूरी तरह से अपलोड कर सकते हैं? –
उत्कृष्ट कार्यान्वयन @compileguy, एडाप्टर द्वारा कार्यक्षमताएं जोड़ें और स्पष्ट हैं, आपको उन्हें ओवरराइड करने की आवश्यकता नहीं है। pkmn सूची में डेटा मान रखने के लिए एक मॉडल वर्ग है – Naruto