简体   繁体   中英

How to filter a custom ListAdapter in android?

I have searched a lot, but no any solutions are working for me. I am seting a custom arrayadapter which has a imageview and a textview. I kept an edittext where i want to add text and i wish to get the list filtered by these given texts, When i use a string type array adapter this works great, but its not working in my custom adapter, here is my code:

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<Currency> adapter;
    List<Currency> 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<Currency> getModel() {
        List<Currency> list = new ArrayList<Currency>();
        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<Currency>() {
            @Override
            public int compare(Currency c1, Currency c2) {
                return c1.getName().compareToIgnoreCase(c2.getName());
            }
        });

        adapter = new Customarrayadapter(this, l);
    }

My custom adapter class is:

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<Currency> {

    private final List<Currency> list;
    private final Activity context;

    public Customarrayadapter(Activity context, List<Currency> 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;
    }
}

Please help me :(

User this code, for filter the text

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

The accepted answer is very misleading and ignores the actual problem. The OP is incorrectly subclassing ArrayAdapter . You should never track your own list of data and instead access that data through the proper adapter methods. Eg, getItem(position) . The ArrayAdapter makes no guarentees that the List instance you pass into it stays the same.

In fact, during a filter operation, it copies the data over to a new ArrayList instance. That means your list used in the subclass is no longer referring to the same list in the ArrayAdapter . Since you are accessing your own list in the getView() method; instead of pulling from getItem() , any filtering changes will be missed. In fact by this point, you also broke the ability to add or remove from the adapter as well.

Most important rule when subclassing ArrayAdapter . Never keep an external list of data. Always refer into the ArrayAdapter instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM