使用自定义(对象)适配器过滤ListView

我正在尝试对使用自定义对象适配器的ListView进行过滤,但是找不到任何有用的示例。包含的代码非常简化,因此请记住,我不能使用常规的ArrayAdapter。我在ListView上方有一个EditText,当用户在EditText小部件中输入文本时,我想用EditText中编写的文本过滤ListView。我们欢迎所有的建议!


这是活动类的代码段:


public class management_objects extends Activity {


private static List<User> UserList;

private EfficientAdapter adapter = null;

private ListView objectListView = null;

private EditText SearchText = null;


private static class EfficientAdapter extends BaseAdapter implements Filterable{

    private LayoutInflater mInflater;   


    public EfficientAdapter(Context context) {

        mInflater = LayoutInflater.from(context);

    }


    public int getCount() {

        return UserList.size();

    }


    public Object getItem(int position) {

        return position;

    }


    public long getItemId(int position) {

        return position;

    }


    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder; 

        if (convertView == null) { 

            convertView = mInflater.inflate(R.layout.imagelayout_2lines, null);

            holder = new ViewHolder();

            holder.text = (TextView) convertView.findViewById(R.id.managementObjectText);

            holder.subtext = (TextView) convertView.findViewById(R.id.managementObjectSubText);

            holder.icon = (ImageView) convertView.findViewById(R.id.managementObjectIcon);

            convertView.setTag(holder);

        }

        else {

            holder = (ViewHolder) convertView.getTag();

        }


        holder.text.setText(UserList.get(position).getFirstName());

        holder.subtext.setText(UserList.get(position).getLastName());

        holder.icon.setImageResource(R.drawable.user);


        return convertView;

    }


    static class ViewHolder { 

        TextView text;

        TextView subtext;

        ImageView icon;

    }


    @Override

    public Filter getFilter() {

        return null;

    }

}

}


陪伴而非守候
浏览 392回答 3
3回答

慕妹3242003

您需要做一些事情:1)在您的活动中,在EditText上注册一个包含用户输入值的文本更改侦听器:mSearchValue.addTextChangedListener(searchTextWatcher);2)创建您的searchTextWatcher并执行以下操作:private TextWatcher searchTextWatcher = new TextWatcher() {&nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onTextChanged(CharSequence s, int start, int before, int count) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ignore&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void beforeTextChanged(CharSequence s, int start, int count, int after) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ignore&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void afterTextChanged(Editable s) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d(Constants.TAG, "*** Search value changed: " + s.toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; adapter.getFilter().filter(s.toString());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };3)在您的自定义适配器中覆盖getFilter(),并使其过滤结果并通知listview数据集已更改。&nbsp; &nbsp; @Override&nbsp; &nbsp; public Filter getFilter() {&nbsp; &nbsp; &nbsp; &nbsp; return new Filter() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @SuppressWarnings("unchecked")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected void publishResults(CharSequence constraint, FilterResults results) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d(Constants.TAG, "**** PUBLISHING RESULTS for: " + constraint);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myData = (List<MyDataType>) results.values;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MyCustomAdapter.this.notifyDataSetChanged();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected FilterResults performFiltering(CharSequence constraint) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d(Constants.TAG, "**** PERFORM FILTERING for: " + constraint);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<MyDataType> filteredResults = getFilteredResults(constraint);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FilterResults results = new FilterResults();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; results.values = filteredResults;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return results;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; }

繁星点点滴滴

这是一个有趣的例子public Filter getFilter() {&nbsp; &nbsp; return new Filter() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; protected FilterResults performFiltering(CharSequence constraint) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final FilterResults oReturn = new FilterResults();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final ArrayList<station> results = new ArrayList<station>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (orig == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; orig = items;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (constraint != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (orig != null && orig.size() > 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (final station g : orig) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (g.getName().toLowerCase()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .contains(constraint.toString()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; results.add(g);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oReturn.values = results;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return oReturn;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @SuppressWarnings("unchecked")&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; protected void publishResults(CharSequence constraint,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FilterResults results) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items = (ArrayList<station>) results.values;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifyDataSetChanged();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };}public void notifyDataSetChanged() {&nbsp; &nbsp; super.notifyDataSetChanged();&nbsp; &nbsp; notifyChanged = true;}

手掌心

对于不需要Filterable界面的用户,有一个简单得多的解决方案。这也可以notifyDataSetChanged()正确处理其他解决方案失败的地方。请注意,您需要向中添加一个getArray()函数,该函数BaseAdapter仅返回传递给构造函数的数组对象。public abstract class BaseFilterAdapter<T> extends BaseAdapter<T> {&nbsp; &nbsp; private List<T> original;&nbsp; &nbsp; private String lastFilter;&nbsp; &nbsp; public BaseFilterAdapter(Context context, List<T> array) {&nbsp; &nbsp; &nbsp; &nbsp; super(context, new LinkedList<T>());&nbsp; &nbsp; &nbsp; &nbsp; original = array;&nbsp; &nbsp; &nbsp; &nbsp; filter("");&nbsp; &nbsp; }&nbsp; &nbsp; protected abstract Boolean predicate(T element, String filter);&nbsp; &nbsp; public void filter(String filter) {&nbsp; &nbsp; &nbsp; &nbsp; lastFilter = filter;&nbsp; &nbsp; &nbsp; &nbsp; super.getArray().clear();&nbsp; &nbsp; &nbsp; &nbsp; for (T element : original)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (predicate(element, filter))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.getArray().add(element);&nbsp; &nbsp; &nbsp; &nbsp; super.notifyDataSetChanged();&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public List<T> getArray() {&nbsp; &nbsp; &nbsp; &nbsp; return original;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void notifyDataSetChanged() {&nbsp; &nbsp; &nbsp; &nbsp; filter(lastFilter);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android