Android Custom ListView adapter filtering

。_饼干妹妹 提交于 2020-01-17 04:24:30

问题


I have problem with filterin my custom adapter in my ListView Here is my code of Adapter

public class PeopleAdapter extends ArrayAdapter<TUser> implements Filterable {

int resource;
String response;
Context context;

private Filter mFilter;

protected List<TUser> mActivitiesList;

//Initialize adapter
public PeopleAdapter(Context context, int resource, List<TUser> items) {
    super(context, resource, items);
    mActivitiesList = items;
    this.resource=resource;


}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    LinearLayout PeopleList;
    //Get the current alert object
    TUser user = getItem(position);

    //Inflate the view
    if(convertView==null)
    {
        PeopleList = new LinearLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater vi;
        vi = (LayoutInflater)getContext().getSystemService(inflater);
        vi.inflate(resource, PeopleList, true);
    }
    else
    {
        PeopleList = (LinearLayout) convertView;
    }
    //Get the text boxes from the listitem.xml file
    TextView ContactName =(TextView)PeopleList.findViewById(R.id.txtNameText);
    TextView ContactNick =(TextView)PeopleList.findViewById(R.id.txtNickText);

    //Assign the appropriate data from our alert object above
    ContactName.setText(user.FName + " " + user.Name);
    ContactNick.setText(user.Nick);

    return PeopleList;
}





@Override
public Filter getFilter() {
    if (mFilter == null)
        mFilter = new ArrayFilter();
    return mFilter;     
}

/**
 * An array filters constrains the content of the array adapter with a prefix. Each
 * item that does not start with the supplied prefix is removed from the list.
 * 
 * 
 */
private class ArrayFilter extends Filter {


private final Object lock = new Object();
private ArrayList<TUser> mOriginalValues;
//protected final LayoutInflater mInflater;

//mInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    @Override
    protected FilterResults performFiltering(CharSequence prefix) {
        FilterResults results = new FilterResults();


        if (mOriginalValues == null) {
            synchronized (lock) {
                mOriginalValues = new ArrayList<TUser>(mActivitiesList);
            }
        }

        if (prefix == null || prefix.length() == 0) {
            synchronized (lock) {
                ArrayList<TUser> list = new ArrayList<TUser>(mOriginalValues);
                results.values = list;
                results.count = list.size();
            }
        } else {
            final String prefixString = prefix.toString().toLowerCase();

            ArrayList<TUser> values = mOriginalValues;
            int count = values.size();

            ArrayList<TUser> newValues = new ArrayList<TUser>(count);

            for (int i = 0; i < count; i++) {
                TUser item = values.get(i);

                String[] words = (item.FName.toLowerCase() + " " + item.Name.toLowerCase()).split(" ");  //item.label.toString().toLowerCase().split(" ");
                int wordCount = words.length;

                for (int k = 0; k < wordCount; k++) {
                    final String word = words[k];

                    if (word.contains(prefixString)) {
                        newValues.add(item);
                        break;
                    }
                }
            }

            results.values = newValues;
            results.count = newValues.size();
        }

        return results;
    }



    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        //noinspection unchecked
        mActivitiesList = (List<TUser>) results.values;
        if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }
    }
}

}

And in my main activity i have this code.

     etPeopleSearch.addTextChangedListener(new TextWatcher() {
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void afterTextChanged(Editable s) {
            /*ListView av = listView;
            PeopleAdapter filterAdapter = (PeopleAdapter)av.getAdapter();
            filterAdapter.getFilter().filter(s.toString());*/

            //PeopleAdapter af = (PeopleAdapter)listView.getAdapter();

            PeopleAdapt.getFilter().filter(s.toString());

        }
    });

Everything goes without error but filtering does not work... can anyone help me?


回答1:


Try this solution:

public void onTextChanged(CharSequence s, int start, int before, int count)
{
    PeopleAdapt.getFilter().filter(s); //Filter from my adapter
    PeopleAdapt.notifyDataSetChanged(); //Update my view
}


来源:https://stackoverflow.com/questions/12212255/android-custom-listview-adapter-filtering

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!