एंड्रॉइड में एक कस्टम ListAdapter फ़िल्टर कैसे करें?

मैंने बहुत कुछ खोजा है, लेकिन मेरे लिए कोई समाधान काम नहीं कर रहा है। मैं कस्टम एरेडैप्टर सेट कर रहा हूं जिसमें एक छविदृश्य और एक टेक्स्टव्यू है। मैंने एक संपादन रखा जहां मैं टेक्स्ट जोड़ना चाहता हूं और मैं इन दिए गए ग्रंथों द्वारा फ़िल्टर की गई सूची प्राप्त करना चाहता हूं, जब मैं एक स्ट्रिंग प्रकार सरणी एडाप्टर का उपयोग करता हूं तो यह बहुत अच्छा काम करता है, लेकिन यह मेरे कस्टम एडाप्टर में काम नहीं कर रहा है, यह मेरा कोड है:

public class CurrenciesFrom extends Activity implements OnItemClickListener {

    ListView lvCurrencies;
    String[] countryCode = { "BDT Bangladesh","BBF bafa" ,"USD America", "UMK Umaka","KRW Korea",
            "INR India" };
    int[] flag = { R.drawable.bdt, R.drawable.usd, R.drawable.aud,
            R.drawable.ic_launcher ,R.drawable.usd, R.drawable.aud};
    ArrayAdapter adapter;
    List l;
    EditText etsearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.currencies);
        initializer();
        lvCurrencies.setAdapter(adapter);
        lvCurrencies.setOnItemClickListener(this);
        etsearch.addTextChangedListener(new TextWatcher() {

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

            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {
               //TODO Auto-generated method stub


                CurrenciesFrom.this.adapter.getFilter().filter(s.toString());
            }
        });
    }

    private List getModel() {
        List list = new ArrayList();
        for (int i = 0; i < countryCode.length; i++) {

            list.add(get(countryCode[i], flag[i]));
        }

        list.get(1).setSelected(true);//select one item by default
        return list;
    }

    private Currency get(String s, int place) {
        return new Currency(s, place);
    }

    private void initializer() {

        lvCurrencies = (ListView) findViewById(R.id.lvCurrencies);
        etsearch=(EditText)findViewById(R.id.etSearch);
        lvCurrencies.setTextFilterEnabled(true);
       //countryCode = getResources().getStringArray(R.array.Currencies);
        l = getModel();

        Collections.sort(l, new Comparator() {
            @Override
            public int compare(Currency c1, Currency c2) {
                return c1.getName().compareToIgnoreCase(c2.getName());
            }
        });

        adapter = new Customarrayadapter(this, l);
    }

मेरा कस्टम एडाप्टर वर्ग है:

package com.powergroupbd.yahoo;

import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

public class Customarrayadapter extends ArrayAdapter {

    private final List list;
    private final Activity context;

    public Customarrayadapter(Activity context, List list) {
        super(context, R.layout.showlist, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView text;
        protected ImageView sub;
        protected CheckBox checkbox;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.showlist, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.label);
            viewHolder.text.setTextColor(Color.WHITE);
            viewHolder.sub = (ImageView) view.findViewById(R.id.sub);

            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
            viewHolder.checkbox
                    .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            Currency element = (Currency) viewHolder.checkbox.getTag();
                            element.setSelected(buttonView.isChecked());
                            System.out.println("Checked : " + element.getName());
                        }
                    });
            view.setTag(viewHolder);
            viewHolder.checkbox.setTag(list.get(position));
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.sub.setImageResource(list.get(position).getPlace());
        holder.checkbox.setChecked(list.get(position).isSelected());
        return view;
    }
}

कृपया मेरी मदद करें :(

1
जोड़ा संपादित
विचारों: 1

2 उत्तर

पाठ को फ़िल्टर करने के लिए, इस कोड को उपयोगकर्ता

public void onTextChanged(CharSequence s, int start,
int before, int count)
{

    textlength = edittext.getText().length();
    text_sort.clear();
    image_sort.clear();

    for (int i = 0; i < text.length; i++)
    {
        if (textlength <= text[i].length())
        {
            if (edittext.getText().toString().
                    equalsIgnoreCase((String) text[i].subSequence(0, textlength)))
            {
                text_sort.add(text[i]);
                image_sort.add(image[i]);
            }
        }
    }

    listview.setAdapter(new MyCustomAdapter(text_sort, image_sort));

    }
}

for more, refer this site it may help you http://android-helper.blogspot.in/2011/07/android-search-in-custom-listview.html

1
जोड़ा
@Reyjohn: text_sort और image_sort क्रमशः फ़िल्टर किए गए टेक्स्ट और छवि हैं, अधिक जानकारी के लिए उस लिंक मैन का संदर्भ लें
जोड़ा लेखक Aerrow, स्रोत
Text_sort, image_sort और टेक्स्ट यहाँ क्या है? कृपया समझाएँ
जोड़ा लेखक Reyjohn, स्रोत
आप thaseems को सहायक होने के लिए लिंक करते हैं, यह मेरी गलती है कि मैं इसे अपने तरीकों से उपयोग नहीं कर सकता
जोड़ा लेखक Reyjohn, स्रोत
मेरी customadapter क्लास एक और जावा फ़ाइल में है, इसलिए मैं कुछ चर के साथ लिंक नहीं कर सकता जिसे आपने दोनों वर्गों में text.size पसंद किया था, इसलिए मैं इसका उपयोग नहीं कर सका
जोड़ा लेखक Reyjohn, स्रोत

स्वीकृत उत्तर बहुत भ्रामक है और वास्तविक समस्या को अनदेखा करता है। ओपी गलत रूप से ArrayAdapter subclassing है। आपको अपनी डेटा की अपनी सूची कभी भी ट्रैक नहीं करना चाहिए और उचित एडाप्टर विधियों के माध्यम से उस डेटा तक पहुंचना चाहिए। उदाहरण के लिए, getItem (स्थिति)ArrayAdapter कोई गारेंटेन्स नहीं बनाता है कि आप जिस सूची उदाहरण में गुजरते हैं, वही रहता है।

वास्तव में, एक फ़िल्टर ऑपरेशन के दौरान, यह डेटा को एक नए ArrayList उदाहरण पर कॉपी करता है। इसका मतलब है कि उप-वर्ग में उपयोग की गई आपकी सूची अब ArrayAdapter में एक ही सूची का जिक्र नहीं कर रही है। चूंकि आप getView() विधि में अपनी खुद की सूची तक पहुंच रहे हैं; getItem() से खींचने के बजाय, किसी भी फ़िल्टरिंग परिवर्तन को याद किया जाएगा। वास्तव में इस बिंदु से, आपने एडेप्टर से जोड़ने या हटाने की क्षमता भी तोड़ दी।

ArrayAdapter subclassing जब सबसे महत्वपूर्ण नियम। डेटा की बाहरी सूची कभी न रखें। इसके बजाय हमेशा ArrayAdapter में देखें।

0
जोड़ा